bitkeeper revision 1.203.1.1 (3eb3c88bjetxHzcoqH6QUfVIBCLFGg)
authorkaf24@scramble.cl.cam.ac.uk <kaf24@scramble.cl.cam.ac.uk>
Sat, 3 May 2003 13:47:55 +0000 (13:47 +0000)
committerkaf24@scramble.cl.cam.ac.uk <kaf24@scramble.cl.cam.ac.uk>
Sat, 3 May 2003 13:47:55 +0000 (13:47 +0000)
xen.flf, figlet.c, README, Makefile, LICENSE, version.h, kernel.c:
  More initial banner fixes -- build version is stored in root Makefile.
xen.flf, figlet.c, README, Makefile, LICENSE:
  new file

.rootkeys
xen/Makefile
xen/common/kernel.c
xen/include/xeno/version.h
xen/tools/Makefile
xen/tools/figlet/LICENSE [new file with mode: 0644]
xen/tools/figlet/Makefile [new file with mode: 0644]
xen/tools/figlet/README [new file with mode: 0644]
xen/tools/figlet/figlet.c [new file with mode: 0644]
xen/tools/figlet/xen.flf [new file with mode: 0644]

index 655b7d0f43435a515dbc556eb6092c62ddd40fed..efe0d08fe2f462c8087f4a0c0401060b48765b31 100644 (file)
--- a/.rootkeys
+++ b/.rootkeys
 3ddb79c4TZj1wXPKQt36O72SddtBNQ xen/net/skbuff.c
 3ddb79c4x8dvwPtzclghWAKFWpEBFA xen/tools/Makefile
 3ddb79c4yGZ7_22QAFFwPzqP4NSHwA xen/tools/elf-reloc.c
+3eb3c87fc79FXLA6R9TvdBJNTvQDwA xen/tools/figlet/LICENSE
+3eb3c87fPL2T_zBb0bHlbZY-ACEKRw xen/tools/figlet/Makefile
+3eb3c87fmKYTC5GCh_rydFakZp9ayw xen/tools/figlet/README
+3eb3c87fdQKQ5OBGbM-KjZfi9Us4ng xen/tools/figlet/figlet.c
+3eb3c87fS7DNbg0i6yhFs28UIqAK5g xen/tools/figlet/xen.flf
 3e5a4e6589G-U42lFKs43plskXoFxQ xenolinux-2.4.21-pre4-sparse/Makefile
 3e5a4e65IEPjnWPZ5w3TxS5scV8Ewg xenolinux-2.4.21-pre4-sparse/arch/xeno/Makefile
 3e5a4e65n-KhsEAs-A4ULiStBp-r6w xenolinux-2.4.21-pre4-sparse/arch/xeno/boot/Makefile
index 1f169bdfe21ad42a59921980af6e1e8e0920f3c8..d12aaf84d6142ad60bd2cd7d0d6fd57e896f2542 100644 (file)
@@ -1,10 +1,16 @@
 
-export BASEDIR := $(shell pwd)
+# This is the correct place to edit the build version.
+# All other places this is stored (eg. compile.h) should be autogenerated.
+export XEN_VERSION       = 1
+export XEN_SUBVERSION    = 0
+export XEN_EXTRAVERSION  = "-beta"
 
-GENERATED_FILES := include/xeno/compile.h
+export BASEDIR          := $(shell pwd)
 
 include Rules.mk
 
+GENERATED_FILES := include/xeno/compile.h
+
 default: $(TARGET)
        gzip -f -9 < $(TARGET) > $(TARGET).gz
 
@@ -37,28 +43,37 @@ make-links: delete-links
 delete-links:
        rm -f include/linux include/asm
 
-# NB. kernel.o is blown away as the build date is stored statically within it
-#     Basically it's the only file dependent on compile.h -- we blow that
-#     dependency away for all other files in Rules.mk.
+# Blow away kernel.o because build info is stored statically within it.
 delete-unfresh-files:
        rm -f $(GENERATED_FILES) common/kernel.o
 
+# compile.h contains dynamic build info. Rebuilt on every 'make' invocation.
 include/xeno/compile.h:
-       @LANG=C echo \#define XEN_COMPILE_DATE \"`date`\" > $@
+       @LANG=C echo /\* Autogenerated by root Makefile. Do not edit. \*/ > $@
+       @LANG=C echo >> $@
+       @LANG=C echo \#define XEN_COMPILE_DATE \"`date`\" >> $@
        @LANG=C echo \#define XEN_COMPILE_TIME \"`date +%T`\" >> $@
        @LANG=C echo \#define XEN_COMPILE_BY \"`whoami`\" >> $@
        @LANG=C echo \#define XEN_COMPILE_DOMAIN \"`([ -x /bin/dnsdomainname ] && /bin/dnsdomainname) || ([ -x /bin/domainname ] && /bin/domainname || echo [unknown])`\" >> $@
        @LANG=C echo \#define XEN_COMPILE_HOST \"`hostname`\" >> $@
        @LANG=C echo \#define XEN_COMPILER \"`$(CC) $(CFLAGS) -v 2>&1 | tail -1`\" >> $@
-
-.PHONY: $(GENERATED_FILES) make-links delete-links default debug install clean delete-unfresh-files
-
-
-SUBDIRS         =arch common drivers net 
+       @LANG=C echo >> $@
+       @LANG=C echo \#define XEN_VERSION\ \ \ \ \ \ $(XEN_VERSION) >> $@
+       @LANG=C echo \#define XEN_SUBVERSION\ \ \ $(XEN_SUBVERSION) >> $@
+       @LANG=C echo \#define XEN_EXTRAVERSION \"$(XEN_EXTRAVERSION)\" >> $@
+       @LANG=C echo >> $@
+       @LANG=C echo \#define XEN_BANNER \\ >> $@
+       cd tools/figlet && make && ./figlet Xen $(XEN_VERSION).$(XEN_SUBVERSION)$(XEN_EXTRAVERSION) 1>>../../$@ && cd ../..
+       @LANG=C echo >> $@
+
+.PHONY: $(GENERATED_FILES) make-links delete-links default 
+.PHONY: debug install clean delete-unfresh-files
+
+SUBDIRS = arch common drivers net 
 TAGS: 
        etags `find include/asm-$(ARCH) -name '*.h'`
        find include -type d \( -name "asm-*" -o -name config \) -prune -o -name '*.h' -print | xargs etags -a
        find $(SUBDIRS) -name '*.[ch]' | xargs etags -a
-
 MAP:
        nm image | grep -v '\(compiled\)\|\(\.o$$\)\|\( [aUw] \)\|\(\.\.ng$$\)\|\(LASH[RL]DI\)' | sort > System.map
+
index 9cb501eb1fec74cd54e24e38e6a3db33771b52bd..c7c24db12ecf9de869cb2e466d8a695b4a421bae 100644 (file)
@@ -166,12 +166,7 @@ void cmain (unsigned long magic, multiboot_info_t *mbi)
     /* INITIALISE SERIAL LINE (printk will work okay from here on). */
     init_serial();
 
-    /* Print the intro banner. The ASCII art is ugle since '\\' -> '\'. */
-    printk(" __  __            _   ___    _          _        \n");
-    printk(" \\ \\/ /___ _ __   / | / _ \\  | |__   ___| |_ __ _ \n");
-    printk("  \\  // _ \\ '_ \\  | || | | | | '_ \\ / _ \\ __/ _` |\n");
-    printk("  /  \\  __/ | | | | || |_| | | |_) |  __/ || (_| |\n");
-    printk(" /_/\\_\\___|_| |_| |_(_)___/  |_.__/ \\___|\\__\\__,_|\n\n");
+    printk(XEN_BANNER);
     printk(" http://www.cl.cam.ac.uk/xeno\n");
     printk(" University of Cambridge Computer Laboratory\n\n");
     printk(" Xen version %d.%d%s (%s@%s) (%s) %s\n\n",
@@ -385,14 +380,22 @@ static inline void __putstr(const char *str)
 void printf (const char *fmt, ...)
 {
     va_list args;
-    char buf[128], *p;
+    char buf[128], *p = fmt;
     unsigned long flags;
 
-    va_start(args, fmt);
-    (void)vsnprintf(buf, sizeof(buf), fmt, args);
-    va_end(args);
-  
-    p = buf; 
+    /*
+     * If the format string contains '%' descriptors then we have to parse it 
+     * before printing it. We parse it into a fixed-length buffer. Long 
+     * strings should therefore _not_ contain '%' characters!
+     */
+    if ( strchr(fmt, '%') != NULL )
+    {
+        va_start(args, fmt);
+        (void)vsnprintf(buf, sizeof(buf), fmt, args);
+        va_end(args);        
+        p = buf; 
+    }
+
     spin_lock_irqsave(&console_lock, flags);
     while ( *p ) putchar(*p++);
     spin_unlock_irqrestore(&console_lock, flags);
index 33aa587b25d8e0c85efe03630eecf8d033b6216c..a0bbfa972f36621c9d7fb379c5f2935fee5eff63 100644 (file)
@@ -1,6 +1,2 @@
 #define KERNEL_VERSION(a,b,c) (((a) << 16) + ((b) << 8) + (c))
 #define LINUX_VERSION_CODE KERNEL_VERSION(2,4,21)
-
-#define XEN_VERSION      1
-#define XEN_SUBVERSION   0
-#define XEN_EXTRAVERSION "-beta"
index ccf535aa49567fd57c8866933ff4ec8c9f6245c9..a143ffdcbf7bfc8920af0ae404a3a82400ecb565 100644 (file)
@@ -1,6 +1,14 @@
 
+all: figlet elf-reloc
+
+figlet:
+       $(MAKE) -C figlet
+
 elf-reloc: elf-reloc.c
        gcc -O2 -Wall -o $@ $<
 
 clean:
        rm -f elf-reloc *~ core
+       $(MAKE) -C figlet clean
+
+.PHONY: figlet
diff --git a/xen/tools/figlet/LICENSE b/xen/tools/figlet/LICENSE
new file mode 100644 (file)
index 0000000..59fd244
--- /dev/null
@@ -0,0 +1,111 @@
+http://www.sunsite.unc.edu/pub/Linux/LICENSES/artistic.license
+
+                        The "Artistic License"
+
+                               Preamble
+
+The intent of this document is to state the conditions under which a
+Package may be copied, such that the Copyright Holder maintains some
+semblance of artistic control over the development of the package,
+while giving the users of the package the right to use and distribute
+the Package in a more-or-less customary fashion, plus the right to make
+reasonable modifications.
+
+Definitions:
+
+       "Package" refers to the collection of files distributed by the
+       Copyright Holder, and derivatives of that collection of files
+       created through textual modification.
+
+       "Standard Version" refers to such a Package if it has not been
+       modified, or has been modified in accordance with the wishes
+       of the Copyright Holder.
+
+       "Copyright Holder" is whoever is named in the copyright or
+       copyrights for the package.
+
+       "You" is you, if you're thinking about copying or distributing
+       this Package.
+
+       "Reasonable copying fee" is whatever you can justify on the
+       basis of media cost, duplication charges, time of people involved,
+       and so on.  (You will not be required to justify it to the
+       Copyright Holder, but only to the computing community at large
+       as a market that must bear the fee.)
+
+       "Freely Available" means that no fee is charged for the item
+       itself, though there may be fees involved in handling the item.
+       It also means that recipients of the item may redistribute it
+       under the same conditions they received it.
+
+1. You may make and give away verbatim copies of the source form of the
+Standard Version of this Package without restriction, provided that you
+duplicate all of the original copyright notices and associated disclaimers.
+
+2. You may apply bug fixes, portability fixes and other modifications
+derived from the Public Domain or from the Copyright Holder.  A Package
+modified in such a way shall still be considered the Standard Version.
+
+3. You may otherwise modify your copy of this Package in any way, provided
+that you insert a prominent notice in each changed file stating how and
+when you changed that file, and provided that you do at least ONE of the
+following:
+
+    a) place your modifications in the Public Domain or otherwise make them
+    Freely Available, such as by posting said modifications to Usenet or
+    an equivalent medium, or placing the modifications on a major archive
+    site such as ftp.uu.net, or by allowing the Copyright Holder to include
+    your modifications in the Standard Version of the Package.
+
+    b) use the modified Package only within your corporation or organization.
+
+    c) rename any non-standard executables so the names do not conflict
+    with standard executables, which must also be provided, and provide
+    a separate manual page for each non-standard executable that clearly
+    documents how it differs from the Standard Version.
+
+    d) make other distribution arrangements with the Copyright Holder.
+
+4. You may distribute the programs of this Package in object code or
+executable form, provided that you do at least ONE of the following:
+
+    a) distribute a Standard Version of the executables and library files,
+    together with instructions (in the manual page or equivalent) on where
+    to get the Standard Version.
+
+    b) accompany the distribution with the machine-readable source of
+    the Package with your modifications.
+
+    c) accompany any non-standard executables with their corresponding
+    Standard Version executables, giving the non-standard executables
+    non-standard names, and clearly documenting the differences in manual
+    pages (or equivalent), together with instructions on where to get
+    the Standard Version.
+
+    d) make other distribution arrangements with the Copyright Holder.
+
+5. You may charge a reasonable copying fee for any distribution of this
+Package.  You may charge any fee you choose for support of this Package.
+You may not charge a fee for this Package itself.  However,
+you may distribute this Package in aggregate with other (possibly
+commercial) programs as part of a larger (possibly commercial) software
+distribution provided that you do not advertise this Package as a
+product of your own.
+
+6. The scripts and library files supplied as input to or produced as
+output from the programs of this Package do not automatically fall
+under the copyright of this Package, but belong to whomever generated
+them, and may be sold commercially, and may be aggregated with this
+Package.
+
+7. C or perl subroutines supplied by you and linked into this Package
+shall not be considered part of this Package.
+
+8. The name of the Copyright Holder may not be used to endorse or promote
+products derived from this software without specific prior written permission.
+
+9. THIS PACKAGE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR
+IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
+WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+
+                               The End
diff --git a/xen/tools/figlet/Makefile b/xen/tools/figlet/Makefile
new file mode 100644 (file)
index 0000000..73bba26
--- /dev/null
@@ -0,0 +1,7 @@
+
+CC := gcc
+
+figlet: figlet.c
+
+clean:
+       rm -f *.o figlet
diff --git a/xen/tools/figlet/README b/xen/tools/figlet/README
new file mode 100644 (file)
index 0000000..b4c58b3
--- /dev/null
@@ -0,0 +1,9 @@
+
+NB. This is a very hacked version of Figlet 2.2.1. 
+
+Don't use this outside the Xen build system. A proper version of Figlet
+can be had from <http://www.figlet.org>.
+
+The distribution license is intact in the LICENSE file.
+
+ -- Keir Fraser (2/5/2003)
diff --git a/xen/tools/figlet/figlet.c b/xen/tools/figlet/figlet.c
new file mode 100644 (file)
index 0000000..36cf750
--- /dev/null
@@ -0,0 +1,2075 @@
+
+/*
+ * XXXXXXXXXXXXXXXXXXXXXXXXXXX
+ * 
+ * This is a HACKED figlet source file for Xen.
+ * 
+ * Hacked to output C octal strings for inclusion in a header file.
+ * Support for opening zippe files is removed.
+ * 
+ * Go to www.figlet.org for teh unhacked Figlet sources!
+ */
+
+/****************************************************************************
+
+  FIGlet Copyright 1991, 1993, 1994 Glenn Chappell and Ian Chai
+  FIGlet Copyright 1996, 1997, 1998, 1999, 2000, 2001 John Cowan
+  FIGlet Copyright 2002 Christiaan Keet
+  Portions written by Paul Burton and Christiaan Keet
+  Internet: <info@figlet.org>
+  FIGlet, along with the various FIGlet fonts and documentation, is
+    copyrighted under the provisions of the Artistic License (as listed
+    in the file "Artistic-license.txt" which is included in this package.
+****************************************************************************/
+
+#define DATE "13 July 2002"
+#define VERSION "2.2.1"
+#define VERSION_INT 20201
+
+/* FIGlet (Frank, Ian & Glenn's Letters) */
+/* by Glenn Chappell */
+/* Apr 1991 */
+/* Automatic file addition by Ian Chai May 1991 */
+/* Punctuation and numbers addition by Ian Chai Jan 1993 */
+/* Full ASCII by Glenn Chappell Feb 1993 */
+/* Line-breaking, general rewrite by Glenn Chappell Mar 1993 */
+/* Hard blanks by Glenn Chappell Apr 1993 */
+/* Release 2.0 5 Aug 1993 */
+/* Right-to-left printing, extended char set by Glenn Chappell Dec 1993 */
+/* Control files by Glenn Chappell Feb 1994 */
+/* Release 2.1 12 Aug 1994 */
+/* Release 2.1.1 25 Aug 1994 */
+/* Release 2.1.2 by Gilbert (Mad Programmer) Healton: Add -A command line 
+   option.  Sept 8, 1996 */
+/* Release 2.2 by John Cowan: multibyte inputs, compressed fonts,
+   mapping tables, kerning/smushing options. */
+/* Release 2.2.1 by Christiaan Keet: minor updates including readmes
+   FAQs and comments. 13 July 2002. The new official FIGlet website is 
+   http://www.figlet.org/  */
+
+#define DEFAULTFONTDIR "."
+#define DEFAULTFONTFILE "xen.flf"
+
+#include <stdio.h>
+#ifdef __STDC__
+#include <stdlib.h>
+#endif
+#include <string.h>
+#include <ctype.h>
+#include <fcntl.h>     /* Needed for get_columns */
+
+#ifdef unix
+#include <sys/ioctl.h> /* Needed for get_columns */
+#endif
+
+
+#define ZFILE FILE
+#define Zopen fopen
+#define Zgetc fgetc
+#define Zungetc(_x,_y) fseek(_y,-1,SEEK_CUR)
+#define Zclose fclose
+
+#define MYSTRLEN(x) ((int)strlen(x)) /* Eliminate ANSI problem */
+
+#define DIRSEP '/'
+#define DIRSEP2 '\\'
+/* Leave alone for Unix and MS-DOS/Windows!
+Note: '/' also used in filename in get_columns(). */
+
+#define FONTFILESUFFIX ".flf"
+#define FONTFILEMAGICNUMBER "flf2"
+#define FSUFFIXLEN MYSTRLEN(FONTFILESUFFIX)
+#define CONTROLFILESUFFIX ".flc"
+#define CONTROLFILEMAGICNUMBER "flc2"   /* no longer used in 2.2 */
+#define CSUFFIXLEN MYSTRLEN(CONTROLFILESUFFIX)
+#define DEFAULTCOLUMNS 80
+
+
+/****************************************************************************
+
+  Globals dealing with chars that are read
+
+****************************************************************************/
+
+typedef long inchr; /* "char" read from stdin */
+
+inchr *inchrline;  /* Alloc'd inchr inchrline[inchrlinelenlimit+1]; */
+                   /* Note: not null-terminated. */
+int inchrlinelen,inchrlinelenlimit;
+inchr deutsch[7] = {196, 214, 220, 228, 246, 252, 223};
+  /* Latin-1 codes for German letters, respectively:
+     LATIN CAPITAL LETTER A WITH DIAERESIS = A-umlaut
+     LATIN CAPITAL LETTER O WITH DIAERESIS = O-umlaut
+     LATIN CAPITAL LETTER U WITH DIAERESIS = U-umlaut
+     LATIN SMALL LETTER A WITH DIAERESIS = a-umlaut
+     LATIN SMALL LETTER O WITH DIAERESIS = o-umlaut
+     LATIN SMALL LETTER U WITH DIAERESIS = u-umlaut
+     LATIN SMALL LETTER SHARP S = ess-zed
+  */
+
+int hzmode;  /* true if reading double-bytes in HZ mode */
+int gndbl[4]; /* gndbl[n] is true if Gn is double-byte */
+inchr gn[4]; /* Gn character sets: ASCII, Latin-1, none, none */
+int gl; /* 0-3 specifies left-half Gn character set */
+int gr; /* 0-3 specifies right-half Gn character set */
+
+int Myargc;  /* to avoid passing around argc and argv */
+char **Myargv;
+
+/****************************************************************************
+
+  Globals dealing with chars that are written
+
+****************************************************************************/
+
+typedef struct fc {
+  inchr ord;
+  char **thechar;  /* Alloc'd char thechar[charheight][]; */
+  struct fc *next;
+  } fcharnode;
+
+fcharnode *fcharlist;
+char **currchar;
+int currcharwidth;
+int previouscharwidth;
+char **outputline;    /* Alloc'd char outputline[charheight][outlinelenlimit+1]; */
+int outlinelen;
+
+
+/****************************************************************************
+
+  Globals dealing with command file storage
+
+****************************************************************************/
+
+typedef struct cfn {
+  char *thename;
+  struct cfn *next;
+  } cfnamenode;
+
+cfnamenode *cfilelist,**cfilelistend;
+
+typedef struct cm {
+  int thecommand;
+  inchr rangelo;
+  inchr rangehi;
+  inchr offset;
+  struct cm *next;
+  } comnode;
+
+comnode *commandlist,**commandlistend;
+
+/****************************************************************************
+
+  Globals affected by command line options
+
+****************************************************************************/
+
+int deutschflag,justification,paragraphflag,right2left,multibyte;
+int cmdinput;
+
+#define SM_SMUSH 128
+#define SM_KERN 64
+#define SM_EQUAL 1
+#define SM_LOWLINE 2
+#define SM_HIERARCHY 4
+#define SM_PAIR 8
+#define SM_BIGX 16
+#define SM_HARDBLANK 32
+
+int smushmode;
+
+#define SMO_NO 0     /* no command-line smushmode */
+#define SMO_YES 1    /* use command-line smushmode, ignore font smushmode */
+#define SMO_FORCE 2  /* logically OR command-line and font smushmodes */
+
+int smushoverride;
+
+int outputwidth;
+int outlinelenlimit;
+char *fontdirname,*fontname;
+
+
+/****************************************************************************
+
+  Globals read from font file
+
+****************************************************************************/
+
+char hardblank;
+int charheight;
+
+
+/****************************************************************************
+
+  Name of program, used in error messages
+
+****************************************************************************/
+
+char *myname;
+
+
+#ifdef TIOCGWINSZ
+/****************************************************************************
+
+  get_columns
+
+  Determines the number of columns of /dev/tty.  Returns the number of
+  columns, or -1 if error.  May return 0 if columns unknown.
+  Requires include files <fcntl.h> and <sys/ioctl.h>.
+  by Glenn Chappell & Ian Chai 14 Apr 1993
+
+****************************************************************************/
+
+int get_columns()
+{
+  struct winsize ws;
+  int fd,result;
+
+  if ((fd = open("/dev/tty",O_WRONLY))<0) return -1;
+  result = ioctl(fd,TIOCGWINSZ,&ws);
+  close(fd);
+  return result?-1:ws.ws_col;
+}
+#endif /* ifdef TIOCGWINSZ */
+
+
+/****************************************************************************
+
+  myalloc
+
+  Calls malloc.  If malloc returns error, prints error message and
+  quits.
+
+****************************************************************************/
+
+#ifdef __STDC__
+char *myalloc(size_t size)
+#else
+char *myalloc(size)
+int size;
+#endif
+{
+  char *ptr;
+#ifndef __STDC__
+  extern void *malloc();
+#endif
+
+  if ((ptr = (char*)malloc(size))==NULL) {
+    fprintf(stderr,"%s: Out of memory\n",myname);
+    exit(1);
+    }
+  else {
+    return ptr;
+    }
+}
+
+
+/****************************************************************************
+
+  hasdirsep
+
+  Returns true if s1 contains a DIRSEP or DIRSEP2 character.
+
+****************************************************************************/
+
+int hasdirsep(s1)
+char *s1;
+{
+  if (strchr(s1, DIRSEP)) return 1;
+  else if (strchr(s1, DIRSEP2)) return 1;
+  else return 0;
+}
+
+/****************************************************************************
+
+  suffixcmp
+
+  Returns true if s2 is a suffix of s1; uses case-blind comparison.
+
+****************************************************************************/
+
+int suffixcmp(s1, s2)
+char *s1;
+char *s2;
+{
+  int len1, len2;
+
+  len1 = MYSTRLEN(s1);
+  len2 = MYSTRLEN(s2);
+  if (len2 > len1) return 0;
+  s1 += len1 - len2;
+  while (*s1) {
+    if (tolower(*s1) != tolower(*s2)) return 0;
+    s1++;
+    s2++;
+    }
+  return 1;
+}
+   
+/****************************************************************************
+
+  skiptoeol
+
+  Skips to the end of a line, given a stream.  Handles \r, \n, or \r\n.
+
+****************************************************************************/
+
+void skiptoeol(fp)
+ZFILE *fp;
+{
+  int dummy;
+
+  while (dummy=Zgetc(fp),dummy!=EOF) {
+    if (dummy == '\n') return;
+    if (dummy == '\r') {
+      dummy = Zgetc(fp);
+      if (dummy != EOF && dummy != '\n') Zungetc(dummy,fp);
+      return;
+      }
+  }
+}
+
+
+/****************************************************************************
+
+  myfgets
+
+  Local version of fgets.  Handles \r, \n, and \r\n terminators.
+
+****************************************************************************/
+
+char *myfgets(line,maxlen,fp)
+char *line;
+int maxlen;
+ZFILE *fp;
+{
+  int c = 0;
+  char *p;
+
+  p = line;
+  while((c=Zgetc(fp))!=EOF&&maxlen) {
+    *p++ = c;
+    maxlen--;
+    if (c=='\n') break;
+    if (c=='\r') {
+      c = Zgetc(fp);
+      if (c != EOF && c != '\n') Zungetc(c,fp);
+      *(p-1) = '\n';
+      break;
+      }
+    }
+  *p = 0;
+  return (c==EOF) ? NULL : line;
+}
+
+/****************************************************************************
+
+  usageerr
+
+  Prints "Usage: ...." line to the given stream.
+
+****************************************************************************/
+
+void printusage(out)
+FILE *out;
+{
+  fprintf(out,
+    "Usage: %s [ -cklnoprstvxDELNRSWX ] [ -d fontdirectory ]\n",
+    myname);
+  fprintf(out,
+    "              [ -f fontfile ] [ -m smushmode ] [ -w outputwidth ]\n");
+  fprintf(out,
+    "              [ -C controlfile ] [ -I infocode ] [ message ]\n");
+}
+
+
+/****************************************************************************
+
+  printinfo
+
+  Prints version and copyright message, or utility information.
+
+****************************************************************************/
+
+void printinfo(infonum)
+int infonum;
+{
+  switch (infonum) {
+    case 0: /* Copyright message */
+      printf("FIGlet Copyright 1991-2002 Glenn Chappell, Ian Chai, ");
+      printf("John Cowan, Christiaan Keet\n");
+      printf("Internet: <info@figlet.org> ");
+      printf("Version: %s, date: %s\n\n",VERSION,DATE);
+      printf("FIGlet, along with the various FIGlet fonts");
+      printf(" and documentation, may be\n");
+      printf("freely copied and distributed.\n\n");
+      printf("If you use FIGlet, please send an");
+      printf(" e-mail message to <info@figlet.org>.\n\n");
+      printf("The latest version of FIGlet is available from the");
+      printf(" web site,\n\thttp://www.figlet.org/\n\n");
+      printusage(stdout);
+      break;
+    case 1: /* Version (integer) */
+      printf("%d\n",VERSION_INT);
+      break;
+    case 2: /* Font directory */
+      printf("%s\n",fontdirname);
+      break;
+    case 3: /* Font */
+      printf("%s\n",fontname);
+      break;
+    case 4: /* Outputwidth */
+      printf("%d\n",outputwidth);
+    }
+}
+
+
+/****************************************************************************
+
+  readmagic
+
+  Reads a four-character magic string from a stream.
+
+****************************************************************************/
+void readmagic(fp,magic)
+ZFILE *fp;
+char *magic;
+{
+  int i;
+
+  for (i=0;i<4;i++) {
+    magic[i] = Zgetc(fp);
+    }
+  magic[4] = 0;
+  }
+  
+/****************************************************************************
+
+  skipws
+
+  Skips whitespace characters from a stream.
+
+****************************************************************************/
+void skipws(fp)
+ZFILE *fp;
+{
+  int c;
+  while (c=Zgetc(fp),isascii(c)&&isspace(c)) ;
+  Zungetc(c,fp);
+  }
+
+/****************************************************************************
+
+  readnum
+
+  Reads a number from a stream.  Accepts "0" prefix for octal and
+  "0x" or "0X" for hexadecimal.  Ignores leading whitespace.
+
+****************************************************************************/
+void readnum(fp,nump)
+ZFILE *fp;
+inchr *nump;
+{
+  int acc = 0;
+  char *p;
+  int c;
+  int base;
+  int sign = 1;
+  char digits[] = "0123456789ABCDEF";
+
+  skipws(fp);
+  c = Zgetc(fp);
+  if (c=='-') {
+    sign = -1;
+    }
+  else {
+    Zungetc(c,fp);
+    }
+  c = Zgetc(fp);
+  if (c=='0') {
+     c = Zgetc(fp);
+     if (c=='x'||c=='X') {
+       base = 16;
+       }
+     else {
+       base = 8;
+       Zungetc(c,fp);
+       }
+    }
+  else {
+    base = 10;
+    Zungetc(c,fp);
+    }
+
+  while((c=Zgetc(fp))!=EOF) {
+    c=toupper(c);
+    p=strchr(digits,c);
+    if (!p) {
+      Zungetc(c,fp);
+      *nump = acc * sign;
+      return;
+      }
+    acc = acc*base+(p-digits);
+    }
+  *nump = acc * sign;
+  }  
+
+/****************************************************************************
+
+  readTchar
+
+  Reads a control file "T" command character specification.
+
+  Character is a single byte, an escape sequence, or
+  an escaped numeric.
+
+****************************************************************************/
+
+inchr readTchar(fp)
+ZFILE *fp;
+{
+  inchr thechar;
+  char next;
+
+  thechar=Zgetc(fp);
+  if (thechar=='\n' || thechar=='\r') { /* Handle badly-formatted file */
+    Zungetc(thechar,fp);
+    return '\0';
+    }
+  if (thechar!='\\') return thechar;
+  next=Zgetc(fp);
+  switch(next) {
+    case 'a':
+      return 7;
+    case 'b':
+      return 8;
+    case 'e':
+      return 27;
+    case 'f':
+      return 12;
+    case 'n':
+      return 10;
+    case 'r':
+      return 13;
+    case 't':
+      return 9;
+    case 'v':
+      return 11;
+    default:
+      if (next=='-' || next=='x' || (next>='0' && next<='9')) {
+        Zungetc(next,fp);
+        readnum(fp,&thechar);
+        return thechar;
+        }
+      return next;
+    }
+}
+
+/****************************************************************************
+
+  charsetname
+
+  Get a Tchar representing a charset name, or 0 if none available.
+  Called in getcharset().
+
+****************************************************************************/
+
+inchr charsetname(fp)
+ZFILE *fp;
+{
+  inchr result;
+
+  result = readTchar(fp);
+  if (result == '\n' || result == '\r') {
+    result = 0;
+    Zungetc(result,fp);
+    }
+  return result;
+  }
+
+/****************************************************************************
+
+  charset
+
+  Processes "g[0123]" character set specifier
+  Called in readcontrol().
+
+****************************************************************************/
+
+void charset(n, controlfile)
+int n;
+ZFILE *controlfile;
+{
+  int ch;
+
+  skipws(controlfile);
+  if (Zgetc(controlfile) != '9') {
+    skiptoeol(controlfile);
+    return;
+    }
+  ch = Zgetc(controlfile);
+  if (ch == '6') {
+     gn[n] = 65536L * charsetname(controlfile) + 0x80;
+     gndbl[n] = 0;
+     skiptoeol(controlfile);
+     return;
+     }
+  if (ch != '4') {
+    skiptoeol(controlfile);
+    return;
+    }
+  ch = Zgetc(controlfile);
+  if (ch == 'x') {
+     if (Zgetc(controlfile) != '9') {
+       skiptoeol(controlfile);
+       return;
+       }
+     if (Zgetc(controlfile) != '4') {
+       skiptoeol(controlfile);
+       return;
+       }
+     skipws(controlfile);
+     gn[n] = 65536L * charsetname(controlfile);
+     gndbl[n] = 1;
+     skiptoeol(controlfile);
+     return;
+     }
+  Zungetc(ch, controlfile);
+  skipws(controlfile);
+  gn[n] = 65536L * charsetname(controlfile);
+  gndbl[n] = 0;
+  return;
+  }
+
+/****************************************************************************
+
+  readcontrol
+
+  Allocates memory and reads in the given control file.
+  Called in readcontrolfiles().
+
+****************************************************************************/
+
+void readcontrol(controlname)
+char *controlname;
+{
+  inchr firstch,lastch;
+  char dashcheck;
+  inchr offset;
+  char *controlpath,magicnum[5];
+  int command;
+  ZFILE *controlfile;
+  int namelen;
+
+  namelen = MYSTRLEN(fontdirname);
+  controlpath = (char*)myalloc(sizeof(char)
+    *(namelen+MYSTRLEN(controlname)+CSUFFIXLEN+2));
+  controlfile = NULL;
+  if (!hasdirsep(controlname)) {
+    strcpy(controlpath,fontdirname);
+    controlpath[namelen] = DIRSEP;
+    controlpath[namelen+1] = '\0';
+    strcat(controlpath,controlname);
+    strcat(controlpath,CONTROLFILESUFFIX);
+    controlfile = Zopen(controlpath,"rb");
+    }
+  if (controlfile==NULL) {
+    strcpy(controlpath,controlname);
+    strcat(controlpath,CONTROLFILESUFFIX);
+    controlfile = Zopen(controlpath,"rb");
+    if (controlfile==NULL) {
+      fprintf(stderr,"%s: %s: Unable to open control file\n",myname,
+        controlpath);
+      exit(1);
+      }
+    }
+
+  free(controlpath);
+
+  (*commandlistend) = (comnode*)myalloc(sizeof(comnode));
+  (*commandlistend)->thecommand = 0; /* Begin with a freeze command */
+  commandlistend = &(*commandlistend)->next;
+  (*commandlistend) = NULL;
+
+  while(command=Zgetc(controlfile),command!=EOF) {
+    switch (command) {
+      case 't': /* Translate */
+        skipws(controlfile);
+        firstch=readTchar(controlfile);
+        if ((dashcheck=Zgetc(controlfile))=='-') {
+          lastch=readTchar(controlfile);
+          }
+        else {
+          Zungetc(dashcheck,controlfile);
+          lastch=firstch;
+          }
+        skipws(controlfile);
+        offset=readTchar(controlfile)-firstch;
+        skiptoeol(controlfile);
+        (*commandlistend) = (comnode*)myalloc(sizeof(comnode));
+        (*commandlistend)->thecommand = 1;
+        (*commandlistend)->rangelo = firstch;
+        (*commandlistend)->rangehi = lastch;
+        (*commandlistend)->offset = offset;
+        commandlistend = &(*commandlistend)->next;
+        (*commandlistend) = NULL;
+        break;
+      case '0': case '1': case '2': case '3': case '4':
+      case '5': case '6': case '7': case '8': case '9':
+      case '-':
+                /* Mapping table entry */
+        Zungetc(command,controlfile);
+        readnum(controlfile,&firstch);
+        skipws(controlfile);
+       readnum(controlfile,&lastch);
+       offset=lastch-firstch;
+        lastch=firstch;
+        skiptoeol(controlfile);
+        (*commandlistend) = (comnode*)myalloc(sizeof(comnode));
+        (*commandlistend)->thecommand = 1;
+        (*commandlistend)->rangelo = firstch;
+        (*commandlistend)->rangehi = lastch;
+        (*commandlistend)->offset = offset;
+        commandlistend = &(*commandlistend)->next;
+        (*commandlistend) = NULL;
+        break;
+      case 'f': /* freeze */
+        skiptoeol(controlfile);
+        (*commandlistend) = (comnode*)myalloc(sizeof(comnode));
+        (*commandlistend)->thecommand = 0;
+        commandlistend = &(*commandlistend)->next;
+        (*commandlistend) = NULL;
+        break;
+      case 'b': /* DBCS input mode */
+        multibyte = 1;
+        break;
+      case 'u': /* UTF-8 input mode */
+        multibyte = 2;
+        break;
+      case 'h': /* HZ input mode */
+        multibyte = 3;
+        break;
+      case 'j': /* Shift-JIS input mode */
+        multibyte = 4;
+        break;
+      case 'g': /* ISO 2022 character set choices */
+        multibyte = 0;
+        skipws(controlfile);
+        command=Zgetc(controlfile);
+        switch (command) {
+          case '0': /* define G0 charset */
+            charset(0, controlfile);
+            break;
+          case '1': /* set G1 charset */
+            charset(1, controlfile);
+            break;
+          case '2': /* set G2 charset */
+            charset(2, controlfile);
+            break;
+          case '3': /* set G3 charset */
+            charset(3, controlfile);
+            break;
+          case 'l': case 'L': /* define left half */
+            skipws(controlfile);
+            gl = Zgetc(controlfile) - '0';
+            skiptoeol(controlfile);
+            break;
+          case 'r': case 'R': /* define right half */
+            skipws(controlfile);
+            gr = Zgetc(controlfile) - '0';
+            skiptoeol(controlfile);
+            break;
+          default: /* meaningless "g" command */
+            skiptoeol(controlfile);
+          }
+      case '\r': case '\n': /* blank line */
+        break;
+      default: /* Includes '#' */
+        skiptoeol(controlfile);
+      }
+    }
+  Zclose(controlfile);
+}
+
+
+/****************************************************************************
+
+  readcontrolfiles
+
+  Reads in the controlfiles names in cfilelist.  Uses readcontrol.
+  Called in main().
+
+****************************************************************************/
+
+void readcontrolfiles()
+{
+  cfnamenode *cfnptr;
+
+  for (cfnptr=cfilelist;cfnptr!=NULL;cfnptr=cfnptr->next) {
+    readcontrol(cfnptr->thename);
+    }
+}
+
+
+/****************************************************************************
+
+  clearcfilelist
+
+  Clears the control file list.  Assumes thename does not need freeing.
+
+****************************************************************************/
+
+void clearcfilelist()
+{
+  cfnamenode *cfnptr1,*cfnptr2;
+
+  cfnptr1 = cfilelist;
+  while (cfnptr1 != NULL) {
+    cfnptr2 = cfnptr1->next;
+    free(cfnptr1);
+    cfnptr1 = cfnptr2;
+    }
+  cfilelist = NULL;
+  cfilelistend = &cfilelist;
+}
+
+
+/****************************************************************************
+
+  getparams
+
+  Handles all command-line parameters.  Puts all parameters within
+  bounds.
+
+****************************************************************************/
+
+void getparams()
+{
+  extern char *optarg;
+  extern int optind;
+  int c; /* "Should" be a char -- need int for "!= -1" test*/
+  int columns,firstfont,infoprint;
+  char *controlname;
+
+  if ((myname = strrchr(Myargv[0],DIRSEP))!=NULL) {
+    myname++;
+    }
+  else {
+    myname = Myargv[0];
+    }
+  fontdirname = DEFAULTFONTDIR;
+  firstfont = 1;
+  fontname = (char*)myalloc(sizeof(char)*(MYSTRLEN(DEFAULTFONTFILE)+1));
+  strcpy(fontname,DEFAULTFONTFILE); /* Some systems don't have strdup() */
+  if (suffixcmp(fontname,FONTFILESUFFIX)) {
+    fontname[MYSTRLEN(fontname)-FSUFFIXLEN]='\0';
+    }
+  cfilelist = NULL;
+  cfilelistend = &cfilelist;
+  commandlist = NULL;
+  commandlistend = &commandlist;
+  smushoverride = SMO_NO;
+  deutschflag = 0;
+  justification = -1;
+  right2left = -1;
+  paragraphflag = 0;
+  infoprint = -1;
+  cmdinput = 0;
+  outputwidth = DEFAULTCOLUMNS;
+  gn[1] = 0x80;
+  gr = 1;
+  while ((c = getopt(Myargc,Myargv,"ADEXLRI:xlcrpntvm:w:d:f:C:NFskSWo"))!= -1) {
+      /* Note: -F is not a legal option -- prints a special err message.  */
+    switch (c) {
+      case 'A':
+        cmdinput = 1;
+        break;
+      case 'D':
+        deutschflag = 1;
+        break;
+      case 'E':
+        deutschflag = 0;
+        break;
+      case 'X':
+        right2left = -1;
+        break;
+      case 'L':
+        right2left = 0;
+        break;
+      case 'R':
+        right2left = 1;
+        break;
+      case 'x':
+        justification = -1;
+        break;
+      case 'l':
+        justification = 0;
+        break;
+      case 'c':
+        justification = 1;
+        break;
+      case 'r':
+        justification = 2;
+        break;
+      case 'p':
+        paragraphflag = 1;
+        break;
+      case 'n':
+        paragraphflag = 0;
+        break;
+      case 's':
+        smushoverride = SMO_NO;
+        break;
+      case 'k':
+        smushmode = SM_KERN;
+        smushoverride = SMO_YES;
+        break;
+      case 'S':
+        smushmode = SM_SMUSH;
+       smushoverride = SMO_FORCE;
+        break;
+      case 'o':
+        smushmode = SM_SMUSH;
+       smushoverride = SMO_YES;
+        break;
+      case 'W':
+        smushmode = 0;
+       smushoverride = SMO_YES;
+        break;
+      case 't':
+#ifdef TIOCGWINSZ
+        columns = get_columns();
+        if (columns>0) {
+          outputwidth = columns;
+          }
+#else /* ifdef TIOCGWINSZ */
+        fprintf(stderr,
+          "%s: \"-t\" is disabled, since ioctl is not fully implemented.\n",
+          myname);
+#endif /* ifdef TIOCGWINSZ */
+        break;
+      case 'v':
+        infoprint = 0;
+        break;
+      case 'I':
+        infoprint = atoi(optarg);
+        break;
+      case 'm':
+        smushmode = atoi(optarg);
+        if (smushmode < -1) {
+          smushoverride = SMO_NO;
+          break;
+          }
+       if (smushmode == 0) smushmode = SM_KERN;
+       else if (smushmode == -1) smushmode = 0;
+       else smushmode = (smushmode & 63) | SM_SMUSH;
+       smushoverride = SMO_YES;
+        break;
+      case 'w':
+        columns = atoi(optarg);
+        if (columns>0) {
+          outputwidth = columns;
+          }
+        break;
+      case 'd':
+        fontdirname = optarg;
+        break;
+      case 'f':
+        if (firstfont) {
+          free(fontname);
+          firstfont = 0;
+          }
+        fontname = optarg;
+        if (suffixcmp(fontname,FONTFILESUFFIX)) {
+          fontname[MYSTRLEN(fontname)-FSUFFIXLEN] = '\0';
+          }
+        break;
+      case 'C':
+        controlname = optarg;
+        if (suffixcmp(controlname, CONTROLFILESUFFIX)) {
+          controlname[MYSTRLEN(controlname)-CSUFFIXLEN] = '\0';
+          }
+        (*cfilelistend) = (cfnamenode*)myalloc(sizeof(cfnamenode));
+        (*cfilelistend)->thename = controlname;
+        cfilelistend = &(*cfilelistend)->next;
+        (*cfilelistend) = NULL;
+        break;
+      case 'N':
+        clearcfilelist();
+        multibyte = 0;
+        gn[0] = 0;
+        gn[1] = 0x80;
+        gn[2] = gn[3] = 0;
+        gndbl[0] = gndbl[1] = gndbl[2] = gndbl[3] = 0;
+        gl = 0;
+        gr = 1;
+        break;
+      case 'F': /* Not a legal option */
+        fprintf(stderr,"%s: illegal option -- F\n",myname);
+        printusage(stderr);
+        fprintf(stderr,"\nBecause of numerous incompatibilities, the");
+        fprintf(stderr," \"-F\" option has been\n");
+        fprintf(stderr,"removed.  It has been replaced by the \"figlist\"");
+        fprintf(stderr," program, which is now\n");
+        fprintf(stderr,"included in the basic FIGlet package.  \"figlist\"");
+        fprintf(stderr," is also available\n");
+        fprintf(stderr,"from  http://www.figlet.org/");
+        fprintf(stderr,"under UNIX utilities.\n");
+        exit(1);
+        break;
+      default:
+        printusage(stderr);
+        exit(1);
+      }
+    }
+  if (optind!=Myargc) cmdinput = 1; /* force cmdinput if more arguments */
+  outlinelenlimit = outputwidth-1;
+  if (infoprint>=0) {
+    printinfo(infoprint);
+    exit(0);
+    }
+}
+
+
+/****************************************************************************
+
+  clearline
+
+  Clears both the input (inchrline) and output (outputline) storage.
+
+****************************************************************************/
+
+void clearline()
+{
+  int i;
+
+  for (i=0;i<charheight;i++) {
+    outputline[i][0] = '\0';
+    }
+  outlinelen = 0;
+  inchrlinelen = 0;
+}
+
+
+/****************************************************************************
+
+  readfontchar
+
+  Reads a font character from the font file, and places it in a
+  newly-allocated entry in the list.
+
+****************************************************************************/
+
+void readfontchar(file,theord,line,maxlen)
+ZFILE *file;
+inchr theord;
+char *line;
+int maxlen;
+{
+  int row,k;
+  char endchar;
+  fcharnode *fclsave;
+
+  fclsave = fcharlist;
+  fcharlist = (fcharnode*)myalloc(sizeof(fcharnode));
+  fcharlist->ord = theord;
+  fcharlist->thechar = (char**)myalloc(sizeof(char*)*charheight);
+  fcharlist->next = fclsave;
+  for (row=0;row<charheight;row++) {
+    if (myfgets(line,maxlen+1,file)==NULL) {
+      line[0] = '\0';
+      }
+    k = MYSTRLEN(line)-1;
+    while (k>=0 && isspace(line[k])) {
+      k--;
+      }
+    if (k>=0) {
+      endchar = line[k];
+      while (k>=0 ? line[k]==endchar : 0) {
+        k--;
+        }
+      }
+    line[k+1] = '\0';
+    fcharlist->thechar[row] = (char*)myalloc(sizeof(char)*(k+2));
+    strcpy(fcharlist->thechar[row],line);
+    }
+}
+
+
+/****************************************************************************
+
+  readfont
+
+  Allocates memory, initializes variables, and reads in the font.
+  Called near beginning of main().
+
+****************************************************************************/
+
+void readfont()
+{
+#define MAXFIRSTLINELEN 1000
+  int i,row,numsread;
+  inchr theord;
+  int maxlen,cmtlines,ffright2left;
+  int smush,smush2;
+  char *fontpath,*fileline,magicnum[5];
+  ZFILE *fontfile;
+  int namelen;
+
+  namelen = MYSTRLEN(fontdirname);
+  fontpath = (char*)myalloc(sizeof(char)
+    *(namelen+MYSTRLEN(fontname)+FSUFFIXLEN+2));
+  fontfile = NULL;
+  if (!hasdirsep(fontname)) {
+    strcpy(fontpath,fontdirname);
+    fontpath[namelen] = DIRSEP;
+    fontpath[namelen+1] = '\0';
+    strcat(fontpath,fontname);
+    strcat(fontpath,FONTFILESUFFIX);
+    fontfile = Zopen(fontpath,"rb");
+    }
+  if (fontfile==NULL) {
+    strcpy(fontpath,fontname);
+    strcat(fontpath,FONTFILESUFFIX);
+    fontfile = Zopen(fontpath,"rb");
+    if (fontfile==NULL) {
+      fprintf(stderr,"%s: %s: Unable to open font file\n",myname,fontpath);
+      exit(1);
+      }
+    }
+
+  readmagic(fontfile,magicnum);
+  fileline = (char*)myalloc(sizeof(char)*(MAXFIRSTLINELEN+1));
+  if (myfgets(fileline,MAXFIRSTLINELEN+1,fontfile)==NULL) {
+    fileline[0] = '\0';
+    }
+  if (MYSTRLEN(fileline)>0 ? fileline[MYSTRLEN(fileline)-1]!='\n' : 0) {
+    skiptoeol(fontfile);
+    }
+  numsread = sscanf(fileline,"%*c%c %d %*d %d %d %d %d %d",
+    &hardblank,&charheight,&maxlen,&smush,&cmtlines,
+    &ffright2left,&smush2);
+  free(fileline);
+  if (strcmp(magicnum,FONTFILEMAGICNUMBER) || numsread<5) {
+    fprintf(stderr,"%s: %s: Not a FIGlet 2 font file\n",myname,fontpath);
+    exit(1);
+    }
+  for (i=1;i<=cmtlines;i++) {
+    skiptoeol(fontfile);
+    }
+  free(fontpath);
+
+  if (numsread<6) {
+    ffright2left = 0;
+    }
+
+  if (numsread<7) { /* if no smush2, decode smush into smush2 */
+    if (smush == 0) smush2 = SM_KERN;
+    else if (smush < 0) smush2 = 0;
+    else smush2 = (smush & 31) | SM_SMUSH;
+    }
+
+  if (charheight<1) {
+    charheight = 1;
+    }
+
+  if (maxlen<1) {
+    maxlen = 1;
+    }
+
+  maxlen += 100; /* Give ourselves some extra room */
+
+  if (smushoverride == SMO_NO)
+     smushmode = smush2;
+  else if (smushoverride == SMO_FORCE)
+     smushmode |= smush2;
+
+  if (right2left<0) {
+    right2left = ffright2left;
+    }
+
+  if (justification<0) {
+    justification = 2*right2left;
+    }
+
+  fileline = (char*)myalloc(sizeof(char)*(maxlen+1));
+  /* Allocate "missing" character */
+  fcharlist = (fcharnode*)myalloc(sizeof(fcharnode));
+  fcharlist->ord = 0;
+  fcharlist->thechar = (char**)myalloc(sizeof(char*)*charheight);
+  fcharlist->next = NULL;
+  for (row=0;row<charheight;row++) {
+    fcharlist->thechar[row] = (char*)myalloc(sizeof(char));
+    fcharlist->thechar[row][0] = '\0';
+    }
+  for (theord=' ';theord<='~';theord++) {
+    readfontchar(fontfile,theord,fileline,maxlen);
+    }
+  for (theord=0;theord<=6;theord++) {
+    readfontchar(fontfile,deutsch[theord],fileline,maxlen);
+    }
+  while (myfgets(fileline,maxlen+1,fontfile)==NULL?0:
+    sscanf(fileline,"%li",&theord)==1) {
+    readfontchar(fontfile,theord,fileline,maxlen);
+    }
+  Zclose(fontfile);
+  free(fileline);
+}
+
+
+/****************************************************************************
+
+  linealloc
+
+  Allocates & clears outputline, inchrline. Sets inchrlinelenlimit.
+  Called near beginning of main().
+
+****************************************************************************/
+
+void linealloc()
+{
+  int row; 
+
+  outputline = (char**)myalloc(sizeof(char*)*charheight);
+  for (row=0;row<charheight;row++) {
+    outputline[row] = (char*)myalloc(sizeof(char)*(outlinelenlimit+1));
+    }
+  inchrlinelenlimit = outputwidth*4+100;
+  inchrline = (inchr*)myalloc(sizeof(inchr)*(inchrlinelenlimit+1));
+  clearline();
+}
+
+
+/****************************************************************************
+
+  getletter
+
+  Sets currchar to point to the font entry for the given character.
+  Sets currcharwidth to the width of this character.
+
+****************************************************************************/
+
+void getletter(c)
+inchr c;
+{
+  fcharnode *charptr;
+
+  for (charptr=fcharlist;charptr==NULL?0:charptr->ord!=c;
+    charptr=charptr->next) ;
+  if (charptr!=NULL) {
+    currchar = charptr->thechar;
+    }
+  else {
+    for (charptr=fcharlist;charptr==NULL?0:charptr->ord!=0;
+      charptr=charptr->next) ;
+    currchar = charptr->thechar;
+    }
+  previouscharwidth = currcharwidth;
+  currcharwidth = MYSTRLEN(currchar[0]);
+}
+
+
+/****************************************************************************
+
+  smushem
+
+  Given 2 characters, attempts to smush them into 1, according to
+  smushmode.  Returns smushed character or '\0' if no smushing can be
+  done.
+
+  smushmode values are sum of following (all values smush blanks):
+    1: Smush equal chars (not hardblanks)
+    2: Smush '_' with any char in hierarchy below
+    4: hierarchy: "|", "/\", "[]", "{}", "()", "<>"
+       Each class in hier. can be replaced by later class.
+    8: [ + ] -> |, { + } -> |, ( + ) -> |
+   16: / + \ -> X, > + < -> X (only in that order)
+   32: hardblank + hardblank -> hardblank
+
+****************************************************************************/
+
+char smushem(lch,rch)
+char lch,rch;
+{
+  if (lch==' ') return rch;
+  if (rch==' ') return lch;
+
+  if (previouscharwidth<2 || currcharwidth<2) return '\0';
+    /* Disallows overlapping if the previous character */
+    /* or the current character has a width of 1 or zero. */
+
+  if ((smushmode & SM_SMUSH) == 0) return '\0';  /* kerning */
+
+  if ((smushmode & 63) == 0) {
+    /* This is smushing by universal overlapping. */
+    if (lch==' ') return rch;
+    if (rch==' ') return lch;
+    if (lch==hardblank) return rch;
+    if (rch==hardblank) return lch;
+      /* Above four lines ensure overlapping preference to */
+      /* visible characters. */
+    if (right2left==1) return lch;
+      /* Above line ensures that the dominant (foreground) */
+      /* fig-character for overlapping is the latter in the */
+      /* user's text, not necessarily the rightmost character. */
+    return rch;
+      /* Occurs in the absence of above exceptions. */
+    }
+  
+  if (smushmode & SM_HARDBLANK) {
+    if (lch==hardblank && rch==hardblank) return lch;
+    }
+
+  if (lch==hardblank || rch==hardblank) return '\0';
+
+  if (smushmode & SM_EQUAL) {
+    if (lch==rch) return lch;
+    }
+
+  if (smushmode & SM_LOWLINE) {
+    if (lch=='_' && strchr("|/\\[]{}()<>",rch)) return rch;
+    if (rch=='_' && strchr("|/\\[]{}()<>",lch)) return lch;
+    }
+
+  if (smushmode & SM_HIERARCHY) {
+    if (lch=='|' && strchr("/\\[]{}()<>",rch)) return rch;
+    if (rch=='|' && strchr("/\\[]{}()<>",lch)) return lch;
+    if (strchr("/\\",lch) && strchr("[]{}()<>",rch)) return rch;
+    if (strchr("/\\",rch) && strchr("[]{}()<>",lch)) return lch;
+    if (strchr("[]",lch) && strchr("{}()<>",rch)) return rch;
+    if (strchr("[]",rch) && strchr("{}()<>",lch)) return lch;
+    if (strchr("{}",lch) && strchr("()<>",rch)) return rch;
+    if (strchr("{}",rch) && strchr("()<>",lch)) return lch;
+    if (strchr("()",lch) && strchr("<>",rch)) return rch;
+    if (strchr("()",rch) && strchr("<>",lch)) return lch;
+    }
+
+  if (smushmode & SM_PAIR) {
+    if (lch=='[' && rch==']') return '|';
+    if (rch=='[' && lch==']') return '|';
+    if (lch=='{' && rch=='}') return '|';
+    if (rch=='{' && lch=='}') return '|';
+    if (lch=='(' && rch==')') return '|';
+    if (rch=='(' && lch==')') return '|';
+    }
+
+  if (smushmode & SM_BIGX) {
+    if (lch=='/' && rch=='\\') return '|';
+    if (rch=='/' && lch=='\\') return 'Y';
+    if (lch=='>' && rch=='<') return 'X';
+      /* Don't want the reverse of above to give 'X'. */
+    }
+
+  return '\0';
+}
+
+
+/****************************************************************************
+
+  smushamt
+
+  Returns the maximum amount that the current character can be smushed
+  into the current line.
+
+****************************************************************************/
+
+int smushamt()
+{
+  int maxsmush,amt;
+  int row,linebd,charbd;
+  char ch1,ch2;
+
+  if ((smushmode & (SM_SMUSH | SM_KERN)) == 0) {
+    return 0;
+    }
+  maxsmush = currcharwidth;
+  for (row=0;row<charheight;row++) {
+    if (right2left) {
+      for (charbd=MYSTRLEN(currchar[row]);
+        ch1=currchar[row][charbd],(charbd>0&&(!ch1||ch1==' '));charbd--) ;
+      for (linebd=0;ch2=outputline[row][linebd],ch2==' ';linebd++) ;
+      amt = linebd+currcharwidth-1-charbd;
+      }
+    else {
+      for (linebd=MYSTRLEN(outputline[row]);
+        ch1 = outputline[row][linebd],(linebd>0&&(!ch1||ch1==' '));linebd--) ;
+      for (charbd=0;ch2=currchar[row][charbd],ch2==' ';charbd++) ;
+      amt = charbd+outlinelen-1-linebd;
+      }
+    if (!ch1||ch1==' ') {
+      amt++;
+      }
+    else if (ch2) {
+      if (smushem(ch1,ch2)!='\0') {
+        amt++;
+        }
+      }
+    if (amt<maxsmush) {
+      maxsmush = amt;
+      }
+    }
+  return maxsmush;
+}
+
+
+/****************************************************************************
+
+  addchar
+
+  Attempts to add the given character onto the end of the current line.
+  Returns 1 if this can be done, 0 otherwise.
+
+****************************************************************************/
+
+int addchar(c)
+inchr c;
+{
+  int smushamount,row,k;
+  char *templine;
+
+  getletter(c);
+  smushamount = smushamt();
+  if (outlinelen+currcharwidth-smushamount>outlinelenlimit
+      ||inchrlinelen+1>inchrlinelenlimit) {
+    return 0;
+    }
+
+  templine = (char*)myalloc(sizeof(char)*(outlinelenlimit+1));
+  for (row=0;row<charheight;row++) {
+    if (right2left) {
+      strcpy(templine,currchar[row]);
+      for (k=0;k<smushamount;k++) {
+        templine[currcharwidth-smushamount+k] =
+          smushem(templine[currcharwidth-smushamount+k],outputline[row][k]);
+        }
+      strcat(templine,outputline[row]+smushamount);
+      strcpy(outputline[row],templine);
+      }
+    else {
+      for (k=0;k<smushamount;k++) {
+        outputline[row][outlinelen-smushamount+k] =
+          smushem(outputline[row][outlinelen-smushamount+k],currchar[row][k]);
+        }
+      strcat(outputline[row],currchar[row]+smushamount);
+      }
+    }
+  free(templine);
+  outlinelen = MYSTRLEN(outputline[0]);
+  inchrline[inchrlinelen++] = c;
+  return 1;
+}
+
+
+/****************************************************************************
+
+  putstring
+
+  Prints out the given null-terminated string, substituting blanks
+  for hardblanks.  If outputwidth is 1, prints the entire string;
+  otherwise prints at most outputwidth-1 characters.  Prints a newline
+  at the end of the string.  The string is left-justified, centered or
+  right-justified (taking outputwidth as the screen width) if
+  justification is 0, 1 or 2, respectively.
+
+****************************************************************************/
+
+static int nr_chars=0;
+static void myputchar(unsigned char c)
+{
+    static int startline = 1;
+
+    if ( startline )
+    {
+        startline = 0;
+        myputchar(' ');
+    }
+
+    putc(c, stderr);
+
+    if ( nr_chars == 0 )
+        putchar('"');
+
+    putchar('\\');
+    putchar('0' + ((c>>6)&7));
+    putchar('0' + ((c>>3)&7));
+    putchar('0' + ((c>>0)&7));
+
+    if ( c == '\n' )
+        startline = 1;
+
+    if ( ++nr_chars == 18 ) 
+    {
+        nr_chars = 0;
+        putchar('"');
+        putchar(' ');
+        putchar('\\');
+        putchar('\n');
+    }
+}
+
+void putstring(string)
+char *string;
+{
+  int i,len;
+
+  len = MYSTRLEN(string);
+  if (outputwidth>1) {
+    if (len>outputwidth-1) {
+      len = outputwidth-1;
+      }
+    if (justification>0) {
+      for (i=1;(3-justification)*i+len+justification-2<outputwidth;i++) {
+        myputchar(' ');
+        }
+      }
+    }
+  for (i=0;i<len;i++) {
+    myputchar(string[i]==hardblank?' ':string[i]);
+    }
+  myputchar('\n');
+}
+
+
+/****************************************************************************
+
+  printline
+
+  Prints outputline using putstring, then clears the current line.
+
+****************************************************************************/
+
+void printline()
+{
+  int i;
+
+  for (i=0;i<charheight;i++) {
+    putstring(outputline[i]);
+    }
+  clearline();
+}
+
+
+/****************************************************************************
+
+  splitline
+
+  Splits inchrline at the last word break (bunch of consecutive blanks).
+  Makes a new line out of the first part and prints it using
+  printline.  Makes a new line out of the second part and returns.
+
+****************************************************************************/
+
+void splitline()
+{
+  int i,gotspace,lastspace,len1,len2;
+  inchr *part1,*part2;
+
+  part1 = (inchr*)myalloc(sizeof(inchr)*(inchrlinelen+1));
+  part2 = (inchr*)myalloc(sizeof(inchr)*(inchrlinelen+1));
+  gotspace = 0;
+  for (i=inchrlinelen-1;i>=0;i--) {
+    if (!gotspace && inchrline[i]==' ') {
+      gotspace = 1;
+      lastspace = i;
+      }
+    if (gotspace && inchrline[i]!=' ') {
+      break;
+      }
+    }
+  len1 = i+1;
+  len2 = inchrlinelen-lastspace-1;
+  for (i=0;i<len1;i++) {
+    part1[i] = inchrline[i];
+    }
+  for (i=0;i<len2;i++) {
+    part2[i] = inchrline[lastspace+1+i];
+    }
+  clearline();
+  for (i=0;i<len1;i++) {
+    addchar(part1[i]);
+    }
+  printline();
+  for (i=0;i<len2;i++) {
+    addchar(part2[i]);
+    }
+  free(part1);
+  free(part2);
+}
+
+
+/****************************************************************************
+
+  handlemapping
+
+  Given an input character (type inchr), executes re-mapping commands
+  read from control files.  Returns re-mapped character (inchr).
+
+****************************************************************************/
+
+inchr handlemapping(c)
+inchr c;
+{
+  comnode *cmptr;
+
+  cmptr=commandlist;
+  while (cmptr!=NULL) {
+    if (cmptr->thecommand ?
+      (c >= cmptr->rangelo && c <= cmptr->rangehi) : 0) {
+      c += cmptr->offset;
+      while(cmptr!=NULL ? cmptr->thecommand : 0) {
+        cmptr=cmptr->next;
+        }
+      }
+    else {
+      cmptr=cmptr->next;
+      }
+    }
+  return c;
+}
+
+/****************************************************************************
+
+  Agetchar
+
+  Replacement to getchar().
+  Acts exactly like getchar if -A is NOT specified,
+  else obtains input from All remaining command line words.
+
+****************************************************************************/
+
+int Agetchar()
+{
+    extern int optind;         /* current argv[] element under study */
+    static AgetMode = 0;       /* >= 0 for displacement into argv[n], <0 EOF */
+    char   *arg;               /* pointer to active character */
+    int    c;                  /* current character */
+
+    if ( ! cmdinput )          /* is -A active? */
+       return( getchar() );    /* no: return stdin character */
+
+    if ( AgetMode < 0 || optind >= Myargc )            /* EOF is sticky: */
+       return( EOF );          /* **ensure it now and forever more */
+
+    /* find next character */
+    arg = Myargv[optind];              /* pointer to active arg */
+    c = arg[AgetMode++]&0xFF;  /* get appropriate char of arg */
+
+    if ( ! c )                 /* at '\0' that terminates word? */
+    {   /* at end of word: return ' ' if normal word, '\n' if empty */
+       c = ' ';                /* suppose normal word and return blank */
+       if ( AgetMode == 1 )    /* if ran out in very 1st char, force \n */
+           c = '\n';           /* (allows "hello '' world" to do \n at '') */
+       AgetMode = 0;           /* return to char 0 in NEXT word */
+       if ( ++optind >= Myargc )       /* run up word count and check if at "EOF" */
+       {   /* just ran out of arguments */
+           c = EOF;            /* return EOF */
+           AgetMode = -1;      /* ensure all future returns return EOF */
+       }
+    }
+
+    return( c );               /* return appropriate character */
+
+}      /* end: Agetchar() */
+
+
+/****************************************************************************
+
+  iso2022
+
+  Called by getinchr.  Interprets ISO 2022 sequences
+
+******************************************************************************/
+
+inchr iso2022()
+{
+  inchr ch;
+  inchr ch2;
+  int save_gl;
+  int save_gr;
+
+  ch = Agetchar();
+  if (ch == EOF) return ch;
+  if (ch == 27) ch = Agetchar() + 0x100; /* ESC x */
+  if (ch == 0x100 + '$') ch = Agetchar() + 0x200; /* ESC $ x */
+  switch (ch) {
+    case 14: /* invoke G0 into GL */
+      gl = 0;
+      return iso2022();
+    case 15: /* invoke G1 into GL */
+      gl = 1;
+      return iso2022();
+    case 142: case 'N' + 0x100: /* invoke G2 into GL for next char */
+      save_gl = gl; save_gr = gr;
+      gl = gr = 2;
+      ch = iso2022();
+      gl = save_gl; gr = save_gr;
+      return ch;
+    case 143: case 'O' + 0x100: /* invoke G3 into GL for next char */
+      save_gl = gl; save_gr = gr;
+      gl = gr = 3;
+      ch = iso2022();
+      gl = save_gl; gr = save_gr;
+      return ch;
+    case 'n' + 0x100: /* invoke G2 into GL */
+      gl = 2;
+      return iso2022();
+    case 'o' + 0x100: /* invoke G3 into GL */
+      gl = 3;
+      return iso2022();
+    case '~' + 0x100: /* invoke G1 into GR */
+      gr = 1;
+      return iso2022();
+    case '}' + 0x100: /* invoke G2 into GR */
+      gr = 2;
+      return iso2022();
+    case '|' + 0x100: /* invoke G3 into GR */
+      gr = 3;
+      return iso2022();
+    case '(' + 0x100: /* set G0 to 94-char set */
+      ch = Agetchar();
+      if (ch == 'B') ch = 0; /* ASCII */
+      gn[0] = ch << 16;
+      gndbl[0] = 0;
+      return iso2022();
+    case ')' + 0x100: /* set G1 to 94-char set */
+      ch = Agetchar();
+      if (ch == 'B') ch = 0;
+      gn[1] = ch << 16;
+      gndbl[1] = 0;
+      return iso2022();
+    case '*' + 0x100: /* set G2 to 94-char set */
+      ch = Agetchar();
+      if (ch == 'B') ch = 0;
+      gn[2] = ch << 16;
+      gndbl[2] = 0;
+      return iso2022();
+    case '+' + 0x100: /* set G3 to 94-char set */
+      ch = Agetchar();
+      if (ch == 'B') ch = 0;
+      gn[3] = ch << 16;
+      gndbl[3] = 0;
+      return iso2022();
+    case '-' + 0x100: /* set G1 to 96-char set */
+      ch = Agetchar();
+      if (ch == 'A') ch = 0; /* Latin-1 top half */
+      gn[1] = (ch << 16) | 0x80;
+      gndbl[1] = 0;
+      return iso2022();
+    case '.' + 0x100: /* set G2 to 96-char set */
+      ch = Agetchar();
+      if (ch == 'A') ch = 0;
+      gn[2] = (ch << 16) | 0x80;
+      gndbl[2] = 0;
+      return iso2022();
+    case '/' + 0x100: /* set G3 to 96-char set */
+      ch = Agetchar();
+      if (ch == 'A') ch = 0;
+      gn[3] = (ch << 16) | 0x80;
+      gndbl[3] = 0;
+      return iso2022();
+    case '(' + 0x200: /* set G0 to 94 x 94 char set */
+      ch = Agetchar();
+      gn[0] = ch << 16;
+      gndbl[0] = 1;
+      return iso2022();
+    case ')' + 0x200: /* set G1 to 94 x 94 char set */
+      ch = Agetchar();
+      gn[1] = ch << 16;
+      gndbl[1] = 1;
+      return iso2022();
+    case '*' + 0x200: /* set G2 to 94 x 94 char set */
+      ch = Agetchar();
+      gn[2] = ch << 16;
+      gndbl[2] = 1;
+      return iso2022();
+    case '+' + 0x200: /* set G3 to 94 x 94 char set */
+      ch = Agetchar();
+      gn[3] = ch << 16;
+      gndbl[3] = 1;
+      return iso2022();
+    default:
+      if (ch & 0x200) { /* set G0 to 94 x 94 char set (deprecated) */
+        gn[0] = (ch & ~0x200) << 16;
+        gndbl[0] = 1;
+        return iso2022();
+        }
+      }
+
+  if (ch >= 0x21 && ch <= 0x7E) { /* process GL */
+    if (gndbl[gl]) {
+      ch2 = Agetchar();
+      return gn[gl] | (ch << 8) | ch2;
+      }
+    else return gn[gl] | ch;
+    }
+  else if (ch >= 0xA0 && ch <= 0xFF) { /* process GR */
+    if (gndbl[gr]) {
+      ch2 = Agetchar();
+      return gn[gr] | (ch << 8) | ch2;
+      }
+    else return gn[gr] | (ch & ~0x80);
+    }
+  else return ch;
+  }
+
+/****************************************************************************
+
+  ungetinchr
+
+  Called by main.  Pushes back an "inchr" to be read by getinchr
+  on the next call.
+
+******************************************************************************/
+inchr getinchr_buffer;
+int getinchr_flag;
+
+inchr ungetinchr(c)
+inchr c;
+{
+  getinchr_buffer = c;
+  getinchr_flag = 1;
+  return c;
+}
+
+/*****************************************************************************
+
+  getinchr
+
+  Called by main.  Processes multibyte characters.  Invokes Agetchar.
+  If multibyte = 0, ISO 2022 mode (see iso2022 routine).
+  If multibyte = 1,  double-byte mode (0x00-0x7f bytes are characters,
+    0x80-0xFF bytes are first byte of a double-byte character).
+  If multibyte = 2, Unicode UTF-8 mode (0x00-0x7F bytes are characters,
+    0x80-0xBF bytes are nonfirst byte of a multibyte character,
+    0xC0-0xFD bytes are first byte of a multibyte character,
+    0xFE-0xFF bytes are errors (all errors return code 0x0080)).
+  If multibyte = 3, HZ mode ("~{" starts double-byte mode, "}~" ends it,
+    "~~" is a tilde, "~x" for all other x is ignored).
+  If multibyte = 4, Shift-JIS mode (0x80-0x9F and 0xE0-0xEF are first byte
+    of a double-byte character, all other bytes are characters).
+
+*****************************************************************************/
+
+inchr getinchr()
+{
+  int ch, ch2, ch3, ch4, ch5, ch6;
+
+  if (getinchr_flag) {
+    getinchr_flag = 0;
+    return getinchr_buffer;
+    }
+
+  switch(multibyte) {
+    case 0: /* single-byte */
+      return iso2022();
+   case 1: /* DBCS */
+     ch = Agetchar();
+     if ((ch >= 0x80 && ch <= 0x9F) ||
+         (ch >= 0xE0 && ch <= 0xEF)) {
+       ch = (ch << 8) + Agetchar();
+       }
+     return ch;
+   case 2: /* UTF-8 */
+      ch = Agetchar();
+      if (ch < 0x80) return ch;  /* handles EOF, too */
+      if (ch < 0xC0 || ch > 0xFD)
+        return 0x0080;  /* illegal first character */
+      ch2 = Agetchar() & 0x3F;
+      if (ch < 0xE0) return ((ch & 0x1F) << 6) + ch2;
+      ch3 = Agetchar() & 0x3F;
+      if (ch < 0xF0)
+        return ((ch & 0x0F) << 12) + (ch2 << 6) + ch3;
+      ch4 = Agetchar() & 0x3F;
+      if (ch < 0xF8)
+        return ((ch & 0x07) << 18) + (ch2 << 12) + (ch3 << 6) + ch4;
+      ch5 = Agetchar() & 0x3F;
+      if (ch < 0xFC)
+        return ((ch & 0x03) << 24) + (ch2 << 18) + (ch3 << 12) +
+          (ch4 << 6) + ch5;
+      ch6 = Agetchar() & 0x3F;
+      return ((ch & 0x01) << 30) + (ch2 << 24) + (ch3 << 18) +
+        (ch4 << 12) + (ch5 << 6) + ch6;
+   case 3: /* HZ */
+     ch = Agetchar();
+     if (ch == EOF) return ch;
+     if (hzmode) {
+       ch = (ch << 8) + Agetchar();
+       if (ch == ('}' << 8) + '~') {
+         hzmode = 0;
+         return getinchr();
+         }
+       return ch;
+       }
+     else if (ch == '~') {
+       ch = Agetchar();
+       if (ch == '{') {
+          hzmode = 1;
+          return getinchr();
+          }
+      else if (ch == '~') {
+        return ch;
+        }
+      else {
+        return getinchr();
+        }
+      }
+     else return ch;
+   case 4: /* Shift-JIS */
+     ch = Agetchar();
+     if ((ch >= 0x80 && ch <= 0x9F) ||
+         (ch >= 0xE0 && ch <= 0xEF)) {
+       ch = (ch << 8) + Agetchar();
+       }
+     return ch;
+   default:
+     return 0x80;
+    }
+  }
+
+/****************************************************************************
+
+  main
+
+  The main program, of course.
+  Reads characters 1 by 1 from stdin, and makes lines out of them using
+  addchar. Handles line breaking, (which accounts for most of the
+  complexity in this function).
+
+****************************************************************************/
+
+int main(argc,argv)
+int argc;
+char *argv[];
+{
+  inchr c,c2;
+  int i;
+  int last_was_eol_flag;
+/*---------------------------------------------------------------------------
+  wordbreakmode:
+    -1: /^$/ and blanks are to be absorbed (when line break was forced
+      by a blank or character larger than outlinelenlimit)
+    0: /^ *$/ and blanks are not to be absorbed
+    1: /[^ ]$/ no word break yet
+    2: /[^ ]  *$/
+    3: /[^ ]$/ had a word break
+---------------------------------------------------------------------------*/
+  int wordbreakmode;
+  int char_not_added;
+
+  Myargc = argc;
+  Myargv = argv;
+  getparams();
+  readcontrolfiles();
+  readfont();
+  linealloc();
+
+  wordbreakmode = 0;
+  last_was_eol_flag = 0;
+
+  while ((c = getinchr())!=EOF) {
+
+    if (c=='\n'&&paragraphflag&&!last_was_eol_flag) {
+      ungetinchr(c2 = getinchr());
+      c = ((isascii(c2)&&isspace(c2))?'\n':' ');
+      }
+    last_was_eol_flag = (isascii(c)&&isspace(c)&&c!='\t'&&c!=' ');
+
+    if (deutschflag) {
+      if (c>='[' && c<=']') {
+        c = deutsch[c-'['];
+        }
+      else if (c >='{' && c <= '~') {
+        c = deutsch[c-'{'+3];
+        }
+      }
+
+    c = handlemapping(c);
+
+    if (isascii(c)&&isspace(c)) {
+      c = (c=='\t'||c==' ') ? ' ' : '\n';
+      }
+
+    if ((c>'\0' && c<' ' && c!='\n') || c==127) continue;
+
+/*
+  Note: The following code is complex and thoroughly tested.
+  Be careful when modifying!
+*/
+
+    do {
+      char_not_added = 0;
+
+      if (wordbreakmode== -1) {
+        if (c==' ') {
+          break;
+          }
+        else if (c=='\n') {
+          wordbreakmode = 0;
+          break;
+          }
+        wordbreakmode = 0;
+        }
+
+      if (c=='\n') {
+        printline();
+        wordbreakmode = 0;
+        }
+
+      else if (addchar(c)) {
+        if (c!=' ') {
+          wordbreakmode = (wordbreakmode>=2)?3:1;
+          }
+        else {
+          wordbreakmode = (wordbreakmode>0)?2:0;
+          }
+        }
+
+      else if (outlinelen==0) {
+        for (i=0;i<charheight;i++) {
+          if (right2left && outputwidth>1) {
+            putstring(currchar[i]+MYSTRLEN(currchar[i])-outlinelenlimit);
+            }
+          else {
+            putstring(currchar[i]);
+            }
+          }
+        wordbreakmode = -1;
+        }
+
+      else if (c==' ') {
+        if (wordbreakmode==2) {
+          splitline();
+          }
+        else {
+          printline();
+          }
+        wordbreakmode = -1;
+        }
+
+      else {
+        if (wordbreakmode>=2) {
+          splitline();
+          }
+        else {
+          printline();
+          }
+        wordbreakmode = (wordbreakmode==3)?1:0;
+        char_not_added = 1;
+        }
+
+      } while (char_not_added);
+    }
+
+  if (outlinelen!=0) {
+    printline();
+    }
+
+  /* XXX Xen hack -- finish off the C macro output */
+  if ( nr_chars != 0 )
+      putchar('"');
+  putchar('\n');
+
+  exit(0);
+}
diff --git a/xen/tools/figlet/xen.flf b/xen/tools/figlet/xen.flf
new file mode 100644 (file)
index 0000000..e13e842
--- /dev/null
@@ -0,0 +1,2230 @@
+flf2a$ 6 5 16 15 14 0 24463 229
+Standard by Glenn Chappell & Ian Chai 3/93 -- based on Frank's .sig
+Includes ISO Latin-1
+figlet release 2.1 -- 12 Aug 1994
+Modified for figlet 2.2 by John Cowan <cowan@ccil.org>
+  to add Latin-{2,3,4,5} support (Unicode U+0100-017F).
+Permission is hereby given to modify this font, as long as the
+modifier's name is placed on a comment line.
+
+Modified by Paul Burton <solution@earthlink.net> 12/96 to include new parameter
+supported by FIGlet and FIGWin.  May also be slightly modified for better use
+of new full-width/kern/smush alternatives, but default output is NOT changed.
+
+Modified by Keir Fraser <kaf24@cl.cam.ac.uk> for Xen build system.
+
+ $@
+ $@
+ $@
+ $@
+ $@
+ $@@
+  _ @
+ | |@
+ | |@
+ |_|@
+ (_)@
+    @@
+  _ _ @
+ ( | )@
+  V V @
+   $  @
+   $  @
+      @@
+    _  _   @
+  _| || |_ @
+ |_  ..  _|@
+ |_      _|@
+   |_||_|  @
+           @@
+   _  @
+  | | @
+ / __)@
+ \__ \@
+ (   /@
+  |_| @@
+  _  __@
+ (_)/ /@
+   / / @
+  / /_ @
+ /_/(_)@
+       @@
+   ___   @
+  ( _ )  @
+  / _ \/\@
+ | (_>  <@
+  \___/\/@
+         @@
+  _ @
+ ( )@
+ |/ @
+  $ @
+  $ @
+    @@
+   __@
+  / /@
+ | | @
+ | | @
+ | | @
+  \_\@@
+ __  @
+ \ \ @
+  | |@
+  | |@
+  | |@
+ /_/ @@
+       @
+ __/\__@
+ \    /@
+ /_  _\@
+   \/  @
+       @@
+        @
+    _   @
+  _| |_ @
+ |_   _|@
+   |_|  @
+        @@
+    @
+    @
+    @
+  _ @
+ ( )@
+ |/ @@
+     @
+     @
+  __ @
+ |__|@
+  $  @
+     @@
+    @
+    @
+    @
+  _ @
+ (_)@
+    @@
+     __@
+    / /@
+   / / @
+  / /  @
+ /_/   @
+       @@
+   ___  @
+  / _ \ @
+ | | | |@
+ | |_| |@
+  \___/ @
+        @@
+  _ @
+ / |@
+ | |@
+ | |@
+ |_|@
+    @@
+  ____  @
+ |___ \ @
+   __) |@
+  / __/ @
+ |_____|@
+        @@
+  _____ @
+ |___ / @
+   |_ \ @
+  ___) |@
+ |____/ @
+        @@
+  _  _   @
+ | || |  @
+ | || |_ @
+ |__   _|@
+    |_|  @
+         @@
+  ____  @
+ | ___| @
+ |___ \ @
+  ___) |@
+ |____/ @
+        @@
+   __   @
+  / /_  @
+ | '_ \ @
+ | (_) |@
+  \___/ @
+        @@
+  _____ @
+ |___  |@
+    / / @
+   / /  @
+  /_/   @
+        @@
+   ___  @
+  ( _ ) @
+  / _ \ @
+ | (_) |@
+  \___/ @
+        @@
+   ___  @
+  / _ \ @
+ | (_) |@
+  \__, |@
+    /_/ @
+        @@
+    @
+  _ @
+ (_)@
+  _ @
+ (_)@
+    @@
+    @
+  _ @
+ (_)@
+  _ @
+ ( )@
+ |/ @@
+   __@
+  / /@
+ / / @
+ \ \ @
+  \_\@
+     @@
+        @
+  _____ @
+ |_____|@
+ |_____|@
+    $   @
+        @@
+ __  @
+ \ \ @
+  \ \@
+  / /@
+ /_/ @
+     @@
+  ___ @
+ |__ \@
+   / /@
+  |_| @
+  (_) @
+      @@
+    ____  @
+   / __ \ @
+  / / _` |@
+ | | (_| |@
+  \ \__,_|@
+   \____/ @@
+     _    @
+    / \   @
+   / _ \  @
+  / ___ \ @
+ /_/   \_\@
+          @@
+  ____  @
+ | __ ) @
+ |  _ \ @
+ | |_) |@
+ |____/ @
+        @@
+   ____ @
+  / ___|@
+ | |    @
+ | |___ @
+  \____|@
+        @@
+  ____  @
+ |  _ \ @
+ | | | |@
+ | |_| |@
+ |____/ @
+        @@
+  _____ @
+ | ____|@
+ |  _|  @
+ | |___ @
+ |_____|@
+        @@
+  _____ @
+ |  ___|@
+ | |_   @
+ |  _|  @
+ |_|    @
+        @@
+   ____ @
+  / ___|@
+ | |  _ @
+ | |_| |@
+  \____|@
+        @@
+  _   _ @
+ | | | |@
+ | |_| |@
+ |  _  |@
+ |_| |_|@
+        @@
+  ___ @
+ |_ _|@
+  | | @
+  | | @
+ |___|@
+      @@
+      _ @
+     | |@
+  _  | |@
+ | |_| |@
+  \___/ @
+        @@
+  _  __@
+ | |/ /@
+ | ' / @
+ | . \ @
+ |_|\_\@
+       @@
+  _     @
+ | |    @
+ | |    @
+ | |___ @
+ |_____|@
+        @@
+  __  __ @
+ |  \/  |@
+ | |\/| |@
+ | |  | |@
+ |_|  |_|@
+         @@
+  _   _ @
+ | \ | |@
+ |  \| |@
+ | |\  |@
+ |_| \_|@
+        @@
+   ___  @
+  / _ \ @
+ | | | |@
+ | |_| |@
+  \___/ @
+        @@
+  ____  @
+ |  _ \ @
+ | |_) |@
+ |  __/ @
+ |_|    @
+        @@
+   ___  @
+  / _ \ @
+ | | | |@
+ | |_| |@
+  \__\_\@
+        @@
+  ____  @
+ |  _ \ @
+ | |_) |@
+ |  _ < @
+ |_| \_\@
+        @@
+  ____  @
+ / ___| @
+ \___ \ @
+  ___) |@
+ |____/ @
+        @@
+  _____ @
+ |_   _|@
+   | |  @
+   | |  @
+   |_|  @
+        @@
+  _   _ @
+ | | | |@
+ | | | |@
+ | |_| |@
+  \___/ @
+        @@
+ __     __@
+ \ \   / /@
+  \ \ / / @
+   \ V /  @
+    \_/   @
+          @@
+ __        __@
+ \ \      / /@
+  \ \ /\ / / @
+   \ V  V /  @
+    \_/\_/   @
+             @@
+ __  __@
+ \ \/ /@
+  \  / @
+  /  \ @
+ /_/\_\@
+       @@
+ __   __@
+ \ \ / /@
+  \ V / @
+   | |  @
+   |_|  @
+        @@
+  _____@
+ |__  /@
+   / / @
+  / /_ @
+ /____|@
+       @@
+  __ @
+ | _|@
+ | | @
+ | | @
+ | | @
+ |__|@@
+ __    @
+ \ \   @
+  \ \  @
+   \ \ @
+    \_\@
+       @@
+  __ @
+ |_ |@
+  | |@
+  | |@
+  | |@
+ |__|@@
+  /\ @
+ |/\|@
+   $ @
+   $ @
+   $ @
+     @@
+        @
+        @
+        @
+        @
+  _____ @
+ |_____|@@
+  _ @
+ ( )@
+  \|@
+  $ @
+  $ @
+    @@
+        @
+   __ _ @
+  / _` |@
+ | (_| |@
+  \__,_|@
+        @@
+  _     @
+ | |__  @
+ | '_ \ @
+ | |_) |@
+ |_.__/ @
+        @@
+       @
+   ___ @
+  / __|@
+ | (__ @
+  \___|@
+       @@
+      _ @
+   __| |@
+  / _` |@
+ | (_| |@
+  \__,_|@
+        @@
+       @
+   ___ @
+  / _ \@
+ |  __/@
+  \___|@
+       @@
+   __ @
+  / _|@
+ | |_ @
+ |  _|@
+ |_|  @
+      @@
+        @
+   __ _ @
+  / _` |@
+ | (_| |@
+  \__, |@
+  |___/ @@
+  _     @
+ | |__  @
+ | '_ \ @
+ | | | |@
+ |_| |_|@
+        @@
+  _ @
+ (_)@
+ | |@
+ | |@
+ |_|@
+    @@
+    _ @
+   (_)@
+   | |@
+   | |@
+  _/ |@
+ |__/ @@
+  _    @
+ | | __@
+ | |/ /@
+ |   < @
+ |_|\_\@
+       @@
+  _ @
+ | |@
+ | |@
+ | |@
+ |_|@
+    @@
+            @
+  _ __ ___  @
+ | '_ ` _ \ @
+ | | | | | |@
+ |_| |_| |_|@
+            @@
+        @
+  _ __  @
+ | '_ \ @
+ | | | |@
+ |_| |_|@
+        @@
+        @
+   ___  @
+  / _ \ @
+ | (_) |@
+  \___/ @
+        @@
+        @
+  _ __  @
+ | '_ \ @
+ | |_) |@
+ | .__/ @
+ |_|    @@
+        @
+   __ _ @
+  / _` |@
+ | (_| |@
+  \__, |@
+     |_|@@
+       @
+  _ __ @
+ | '__|@
+ | |   @
+ |_|   @
+       @@
+      @
+  ___ @
+ / __|@
+ \__ \@
+ |___/@
+      @@
+  _   @
+ | |_ @
+ | __|@
+ | |_ @
+  \__|@
+      @@
+        @
+  _   _ @
+ | | | |@
+ | |_| |@
+  \__,_|@
+        @@
+        @
+ __   __@
+ \ \ / /@
+  \ V / @
+   \_/  @
+        @@
+           @
+ __      __@
+ \ \ /\ / /@
+  \ V  V / @
+   \_/\_/  @
+           @@
+       @
+ __  __@
+ \ \/ /@
+  >  < @
+ /_/\_\@
+       @@
+        @
+  _   _ @
+ | | | |@
+ | |_| |@
+  \__, |@
+  |___/ @@
+      @
+  ____@
+ |_  /@
+  / / @
+ /___|@
+      @@
+    __@
+   / /@
+  | | @
+ < <  @
+  | | @
+   \_\@@
+  _ @
+ | |@
+ | |@
+ | |@
+ | |@
+ |_|@@
+ __   @
+ \ \  @
+  | | @
+   > >@
+  | | @
+ /_/  @@
+  /\/|@
+ |/\/ @
+   $  @
+   $  @
+   $  @
+      @@
+  _   _ @
+ (_)_(_)@
+   /_\  @
+  / _ \ @
+ /_/ \_\@
+        @@
+  _   _ @
+ (_)_(_)@
+  / _ \ @
+ | |_| |@
+  \___/ @
+        @@
+  _   _ @
+ (_) (_)@
+ | | | |@
+ | |_| |@
+  \___/ @
+        @@
+  _   _ @
+ (_)_(_)@
+  / _` |@
+ | (_| |@
+  \__,_|@
+        @@
+  _   _ @
+ (_)_(_)@
+  / _ \ @
+ | (_) |@
+  \___/ @
+        @@
+  _   _ @
+ (_) (_)@
+ | | | |@
+ | |_| |@
+  \__,_|@
+        @@
+   ___ @
+  / _ \@
+ | |/ /@
+ | |\ \@
+ | ||_/@
+ |_|   @@
+160  NO-BREAK SPACE
+ $@
+ $@
+ $@
+ $@
+ $@
+ $@@
+161  INVERTED EXCLAMATION MARK
+  _ @
+ (_)@
+ | |@
+ | |@
+ |_|@
+    @@
+162  CENT SIGN
+    _  @
+   | | @
+  / __)@
+ | (__ @
+  \   )@
+   |_| @@
+163  POUND SIGN
+    ___  @
+   / ,_\ @
+ _| |_   @
+  | |___ @
+ (_,____|@
+         @@
+164  CURRENCY SIGN
+ /\___/\@
+ \  _  /@
+ | (_) |@
+ / ___ \@
+ \/   \/@
+        @@
+165  YEN SIGN
+  __ __ @
+  \ V / @
+ |__ __|@
+ |__ __|@
+   |_|  @
+        @@
+166  BROKEN BAR
+  _ @
+ | |@
+ |_|@
+  _ @
+ | |@
+ |_|@@
+167  SECTION SIGN
+    __ @
+  _/ _)@
+ / \ \ @
+ \ \\ \@
+  \ \_/@
+ (__/  @@
+168  DIAERESIS
+  _   _ @
+ (_) (_)@
+  $   $ @
+  $   $ @
+  $   $ @
+        @@
+169  COPYRIGHT SIGN
+    _____   @
+   / ___ \  @
+  / / __| \ @
+ | | (__   |@
+  \ \___| / @
+   \_____/  @@
+170  FEMININE ORDINAL INDICATOR
+  __ _ @
+ / _` |@
+ \__,_|@
+ |____|@
+    $  @
+       @@
+171  LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+   ____@
+  / / /@
+ / / / @
+ \ \ \ @
+  \_\_\@
+       @@
+172  NOT SIGN
+        @
+  _____ @
+ |___  |@
+     |_|@
+    $   @
+        @@
+173  SOFT HYPHEN
+       @
+       @
+  ____ @
+ |____|@
+    $  @
+       @@
+174  REGISTERED SIGN
+    _____   @
+   / ___ \  @
+  / | _ \ \ @
+ |  |   /  |@
+  \ |_|_\ / @
+   \_____/  @@
+175  MACRON
+  _____ @
+ |_____|@
+    $   @
+    $   @
+    $   @
+        @@
+176  DEGREE SIGN
+   __  @
+  /  \ @
+ | () |@
+  \__/ @
+    $  @
+       @@
+177  PLUS-MINUS SIGN
+    _   @
+  _| |_ @
+ |_   _|@
+  _|_|_ @
+ |_____|@
+        @@
+178  SUPERSCRIPT TWO
+  ___ @
+ |_  )@
+  / / @
+ /___|@
+   $  @
+      @@
+179  SUPERSCRIPT THREE
+  ____@
+ |__ /@
+  |_ \@
+ |___/@
+   $  @
+      @@
+180  ACUTE ACCENT
+  __@
+ /_/@
+  $ @
+  $ @
+  $ @
+    @@
+181  MICRO SIGN
+        @
+  _   _ @
+ | | | |@
+ | |_| |@
+ | ._,_|@
+ |_|    @@
+182  PILCROW SIGN
+   _____ @
+  /     |@
+ | (| | |@
+  \__ | |@
+    |_|_|@
+         @@
+183  MIDDLE DOT
+    @
+  _ @
+ (_)@
+  $ @
+  $ @
+    @@
+184  CEDILLA
+    @
+    @
+    @
+    @
+  _ @
+ )_)@@
+185  SUPERSCRIPT ONE
+  _ @
+ / |@
+ | |@
+ |_|@
+  $ @
+    @@
+186  MASCULINE ORDINAL INDICATOR
+  ___ @
+ / _ \@
+ \___/@
+ |___|@
+   $  @
+      @@
+187  RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+ ____  @
+ \ \ \ @
+  \ \ \@
+  / / /@
+ /_/_/ @
+       @@
+188  VULGAR FRACTION ONE QUARTER
+  _   __    @
+ / | / / _  @
+ | |/ / | | @
+ |_/ /|_  _|@
+  /_/   |_| @
+            @@
+189  VULGAR FRACTION ONE HALF
+  _   __   @
+ / | / /__ @
+ | |/ /_  )@
+ |_/ / / / @
+  /_/ /___|@
+           @@
+190  VULGAR FRACTION THREE QUARTERS
+  ____  __    @
+ |__ / / / _  @
+  |_ \/ / | | @
+ |___/ /|_  _|@
+    /_/   |_| @
+              @@
+191  INVERTED QUESTION MARK
+   _  @
+  (_) @
+  | | @
+ / /_ @
+ \___|@
+      @@
+192  LATIN CAPITAL LETTER A WITH GRAVE
+   __   @
+   \_\  @
+   /_\  @
+  / _ \ @
+ /_/ \_\@
+        @@
+193  LATIN CAPITAL LETTER A WITH ACUTE
+    __  @
+   /_/  @
+   /_\  @
+  / _ \ @
+ /_/ \_\@
+        @@
+194  LATIN CAPITAL LETTER A WITH CIRCUMFLEX
+   //\  @
+  |/_\| @
+   /_\  @
+  / _ \ @
+ /_/ \_\@
+        @@
+195  LATIN CAPITAL LETTER A WITH TILDE
+   /\/| @
+  |/\/  @
+   /_\  @
+  / _ \ @
+ /_/ \_\@
+        @@
+196  LATIN CAPITAL LETTER A WITH DIAERESIS
+  _   _ @
+ (_)_(_)@
+   /_\  @
+  / _ \ @
+ /_/ \_\@
+        @@
+197  LATIN CAPITAL LETTER A WITH RING ABOVE
+    _   @
+   (o)  @
+   /_\  @
+  / _ \ @
+ /_/ \_\@
+        @@
+198  LATIN CAPITAL LETTER AE
+     ______ @
+    /  ____|@
+   / _  _|  @
+  / __ |___ @
+ /_/ |_____|@
+            @@
+199  LATIN CAPITAL LETTER C WITH CEDILLA
+   ____ @
+  / ___|@
+ | |    @
+ | |___ @
+  \____|@
+    )_) @@
+200  LATIN CAPITAL LETTER E WITH GRAVE
+   __   @
+  _\_\_ @
+ | ____|@
+ |  _|_ @
+ |_____|@
+        @@
+201  LATIN CAPITAL LETTER E WITH ACUTE
+    __  @
+  _/_/_ @
+ | ____|@
+ |  _|_ @
+ |_____|@
+        @@
+202  LATIN CAPITAL LETTER E WITH CIRCUMFLEX
+   //\  @
+  |/_\| @
+ | ____|@
+ |  _|_ @
+ |_____|@
+        @@
+203  LATIN CAPITAL LETTER E WITH DIAERESIS
+  _   _ @
+ (_)_(_)@
+ | ____|@
+ |  _|_ @
+ |_____|@
+        @@
+204  LATIN CAPITAL LETTER I WITH GRAVE
+  __  @
+  \_\ @
+ |_ _|@
+  | | @
+ |___|@
+      @@
+205  LATIN CAPITAL LETTER I WITH ACUTE
+   __ @
+  /_/ @
+ |_ _|@
+  | | @
+ |___|@
+      @@
+206  LATIN CAPITAL LETTER I WITH CIRCUMFLEX
+  //\ @
+ |/_\|@
+ |_ _|@
+  | | @
+ |___|@
+      @@
+207  LATIN CAPITAL LETTER I WITH DIAERESIS
+  _   _ @
+ (_)_(_)@
+  |_ _| @
+   | |  @
+  |___| @
+        @@
+208  LATIN CAPITAL LETTER ETH
+    ____  @
+   |  _ \ @
+  _| |_| |@
+ |__ __| |@
+   |____/ @
+          @@
+209  LATIN CAPITAL LETTER N WITH TILDE
+   /\/|@
+  |/\/ @
+ | \| |@
+ | .` |@
+ |_|\_|@
+       @@
+210  LATIN CAPITAL LETTER O WITH GRAVE
+   __   @
+   \_\  @
+  / _ \ @
+ | |_| |@
+  \___/ @
+        @@
+211  LATIN CAPITAL LETTER O WITH ACUTE
+    __  @
+   /_/  @
+  / _ \ @
+ | |_| |@
+  \___/ @
+        @@
+212  LATIN CAPITAL LETTER O WITH CIRCUMFLEX
+   //\  @
+  |/_\| @
+  / _ \ @
+ | |_| |@
+  \___/ @
+        @@
+213  LATIN CAPITAL LETTER O WITH TILDE
+   /\/| @
+  |/\/  @
+  / _ \ @
+ | |_| |@
+  \___/ @
+        @@
+214  LATIN CAPITAL LETTER O WITH DIAERESIS
+  _   _ @
+ (_)_(_)@
+  / _ \ @
+ | |_| |@
+  \___/ @
+        @@
+215  MULTIPLICATION SIGN
+     @
+     @
+ /\/\@
+ >  <@
+ \/\/@
+     @@
+216  LATIN CAPITAL LETTER O WITH STROKE
+   ____ @
+  / _// @
+ | |// |@
+ | //| |@
+  //__/ @
+        @@
+217  LATIN CAPITAL LETTER U WITH GRAVE
+   __   @
+  _\_\_ @
+ | | | |@
+ | |_| |@
+  \___/ @
+        @@
+218  LATIN CAPITAL LETTER U WITH ACUTE
+    __  @
+  _/_/_ @
+ | | | |@
+ | |_| |@
+  \___/ @
+        @@
+219  LATIN CAPITAL LETTER U WITH CIRCUMFLEX
+   //\  @
+  |/ \| @
+ | | | |@
+ | |_| |@
+  \___/ @
+        @@
+220  LATIN CAPITAL LETTER U WITH DIAERESIS
+  _   _ @
+ (_) (_)@
+ | | | |@
+ | |_| |@
+  \___/ @
+        @@
+221  LATIN CAPITAL LETTER Y WITH ACUTE
+    __  @
+ __/_/__@
+ \ \ / /@
+  \ V / @
+   |_|  @
+        @@
+222  LATIN CAPITAL LETTER THORN
+  _     @
+ | |___ @
+ |  __ \@
+ |  ___/@
+ |_|    @
+        @@
+223  LATIN SMALL LETTER SHARP S
+   ___ @
+  / _ \@
+ | |/ /@
+ | |\ \@
+ | ||_/@
+ |_|   @@
+224  LATIN SMALL LETTER A WITH GRAVE
+   __   @
+   \_\_ @
+  / _` |@
+ | (_| |@
+  \__,_|@
+        @@
+225  LATIN SMALL LETTER A WITH ACUTE
+    __  @
+   /_/_ @
+  / _` |@
+ | (_| |@
+  \__,_|@
+        @@
+226  LATIN SMALL LETTER A WITH CIRCUMFLEX
+   //\  @
+  |/_\| @
+  / _` |@
+ | (_| |@
+  \__,_|@
+        @@
+227  LATIN SMALL LETTER A WITH TILDE
+   /\/| @
+  |/\/_ @
+  / _` |@
+ | (_| |@
+  \__,_|@
+        @@
+228  LATIN SMALL LETTER A WITH DIAERESIS
+  _   _ @
+ (_)_(_)@
+  / _` |@
+ | (_| |@
+  \__,_|@
+        @@
+229  LATIN SMALL LETTER A WITH RING ABOVE
+    __  @
+   (()) @
+  / _ '|@
+ | (_| |@
+  \__,_|@
+        @@
+230  LATIN SMALL LETTER AE
+           @
+   __ ____ @
+  / _`  _ \@
+ | (_|  __/@
+  \__,____|@
+           @@
+231  LATIN SMALL LETTER C WITH CEDILLA
+       @
+   ___ @
+  / __|@
+ | (__ @
+  \___|@
+   )_) @@
+232  LATIN SMALL LETTER E WITH GRAVE
+   __  @
+   \_\ @
+  / _ \@
+ |  __/@
+  \___|@
+       @@
+233  LATIN SMALL LETTER E WITH ACUTE
+    __ @
+   /_/ @
+  / _ \@
+ |  __/@
+  \___|@
+       @@
+234  LATIN SMALL LETTER E WITH CIRCUMFLEX
+   //\ @
+  |/_\|@
+  / _ \@
+ |  __/@
+  \___|@
+       @@
+235  LATIN SMALL LETTER E WITH DIAERESIS
+  _   _ @
+ (_)_(_)@
+  / _ \ @
+ |  __/ @
+  \___| @
+        @@
+236  LATIN SMALL LETTER I WITH GRAVE
+ __ @
+ \_\@
+ | |@
+ | |@
+ |_|@
+    @@
+237  LATIN SMALL LETTER I WITH ACUTE
+  __@
+ /_/@
+ | |@
+ | |@
+ |_|@
+    @@
+238  LATIN SMALL LETTER I WITH CIRCUMFLEX
+  //\ @
+ |/_\|@
+  | | @
+  | | @
+  |_| @
+      @@
+239  LATIN SMALL LETTER I WITH DIAERESIS
+  _   _ @
+ (_)_(_)@
+   | |  @
+   | |  @
+   |_|  @
+        @@
+240  LATIN SMALL LETTER ETH
+   /\/\ @
+   >  < @
+  _\/\ |@
+ / __` |@
+ \____/ @
+        @@
+241  LATIN SMALL LETTER N WITH TILDE
+   /\/| @
+  |/\/  @
+ | '_ \ @
+ | | | |@
+ |_| |_|@
+        @@
+242  LATIN SMALL LETTER O WITH GRAVE
+   __   @
+   \_\  @
+  / _ \ @
+ | (_) |@
+  \___/ @
+        @@
+243  LATIN SMALL LETTER O WITH ACUTE
+    __  @
+   /_/  @
+  / _ \ @
+ | (_) |@
+  \___/ @
+        @@
+244  LATIN SMALL LETTER O WITH CIRCUMFLEX
+   //\  @
+  |/_\| @
+  / _ \ @
+ | (_) |@
+  \___/ @
+        @@
+245  LATIN SMALL LETTER O WITH TILDE
+   /\/| @
+  |/\/  @
+  / _ \ @
+ | (_) |@
+  \___/ @
+        @@
+246  LATIN SMALL LETTER O WITH DIAERESIS
+  _   _ @
+ (_)_(_)@
+  / _ \ @
+ | (_) |@
+  \___/ @
+        @@
+247  DIVISION SIGN
+        @
+    _   @
+  _(_)_ @
+ |_____|@
+   (_)  @
+        @@
+248  LATIN SMALL LETTER O WITH STROKE
+         @
+   ____  @
+  / _//\ @
+ | (//) |@
+  \//__/ @
+         @@
+249  LATIN SMALL LETTER U WITH GRAVE
+   __   @
+  _\_\_ @
+ | | | |@
+ | |_| |@
+  \__,_|@
+        @@
+250  LATIN SMALL LETTER U WITH ACUTE
+    __  @
+  _/_/_ @
+ | | | |@
+ | |_| |@
+  \__,_|@
+        @@
+251  LATIN SMALL LETTER U WITH CIRCUMFLEX
+   //\  @
+  |/ \| @
+ | | | |@
+ | |_| |@
+  \__,_|@
+        @@
+252  LATIN SMALL LETTER U WITH DIAERESIS
+  _   _ @
+ (_) (_)@
+ | | | |@
+ | |_| |@
+  \__,_|@
+        @@
+253  LATIN SMALL LETTER Y WITH ACUTE
+    __  @
+  _/_/_ @
+ | | | |@
+ | |_| |@
+  \__, |@
+  |___/ @@
+254  LATIN SMALL LETTER THORN
+  _     @
+ | |__  @
+ | '_ \ @
+ | |_) |@
+ | .__/ @
+ |_|    @@
+255  LATIN SMALL LETTER Y WITH DIAERESIS
+  _   _ @
+ (_) (_)@
+ | | | |@
+ | |_| |@
+  \__, |@
+  |___/ @@
+0x0100  LATIN CAPITAL LETTER A WITH MACRON
+   ____ @
+  /___/ @
+   /_\  @
+  / _ \ @
+ /_/ \_\@
+        @@
+0x0101  LATIN SMALL LETTER A WITH MACRON
+    ___ @
+   /_ _/@
+  / _` |@
+ | (_| |@
+  \__,_|@
+        @@
+0x0102  LATIN CAPITAL LETTER A WITH BREVE
+  _   _ @
+  \\_// @
+   /_\  @
+  / _ \ @
+ /_/ \_\@
+        @@
+0x0103  LATIN SMALL LETTER A WITH BREVE
+   \_/  @
+   ___  @
+  / _` |@
+ | (_| |@
+  \__,_|@
+        @@
+0x0104  LATIN CAPITAL LETTER A WITH OGONEK
+        @
+    _   @
+   /_\  @
+  / _ \ @
+ /_/ \_\@
+     (_(@@
+0x0105  LATIN SMALL LETTER A WITH OGONEK
+        @
+   __ _ @
+  / _` |@
+ | (_| |@
+  \__,_|@
+     (_(@@
+0x0106  LATIN CAPITAL LETTER C WITH ACUTE
+     __ @
+   _/_/ @
+  / ___|@
+ | |___ @
+  \____|@
+        @@
+0x0107  LATIN SMALL LETTER C WITH ACUTE
+    __ @
+   /__/@
+  / __|@
+ | (__ @
+  \___|@
+       @@
+0x0108  LATIN CAPITAL LETTER C WITH CIRCUMFLEX
+     /\ @
+   _//\\@
+  / ___|@
+ | |___ @
+  \____|@
+        @@
+0x0109  LATIN SMALL LETTER C WITH CIRCUMFLEX
+    /\ @
+   /_\ @
+  / __|@
+ | (__ @
+  \___|@
+       @@
+0x010A  LATIN CAPITAL LETTER C WITH DOT ABOVE
+    []  @
+   ____ @
+  / ___|@
+ | |___ @
+  \____|@
+        @@
+0x010B  LATIN SMALL LETTER C WITH DOT ABOVE
+   []  @
+   ___ @
+  / __|@
+ | (__ @
+  \___|@
+       @@
+0x010C  LATIN CAPITAL LETTER C WITH CARON
+   \\// @
+   _\/_ @
+  / ___|@
+ | |___ @
+  \____|@
+        @@
+0x010D  LATIN SMALL LETTER C WITH CARON
+   \\//@
+   _\/ @
+  / __|@
+ | (__ @
+  \___|@
+       @@
+0x010E  LATIN CAPITAL LETTER D WITH CARON
+   \\// @
+  __\/  @
+ |  _ \ @
+ | |_| |@
+ |____/ @
+        @@
+0x010F  LATIN SMALL LETTER D WITH CARON
+  \/  _ @
+   __| |@
+  / _` |@
+ | (_| |@
+  \__,_|@
+        @@
+0x0110  LATIN CAPITAL LETTER D WITH STROKE
+   ____   @
+  |_ __ \ @
+ /| |/ | |@
+ /|_|/_| |@
+  |_____/ @
+          @@
+0x0111  LATIN SMALL LETTER D WITH STROKE
+    ---|@
+   __| |@
+  / _` |@
+ | (_| |@
+  \__,_|@
+        @@
+0x0112  LATIN CAPITAL LETTER E WITH MACRON
+   ____ @
+  /___/ @
+ | ____|@
+ |  _|_ @
+ |_____|@
+        @@
+0x0113  LATIN SMALL LETTER E WITH MACRON
+    ____@
+   /_ _/@
+  / _ \ @
+ |  __/ @
+  \___| @
+        @@
+0x0114  LATIN CAPITAL LETTER E WITH BREVE
+  _   _ @
+  \\_// @
+ | ____|@
+ |  _|_ @
+ |_____|@
+        @@
+0x0115  LATIN SMALL LETTER E WITH BREVE
+  \\  //@
+    --  @
+  / _ \ @
+ |  __/ @
+  \___| @
+        @@
+0x0116  LATIN CAPITAL LETTER E WITH DOT ABOVE
+    []  @
+  _____ @
+ | ____|@
+ |  _|_ @
+ |_____|@
+        @@
+0x0117  LATIN SMALL LETTER E WITH DOT ABOVE
+    [] @
+    __ @
+  / _ \@
+ |  __/@
+  \___|@
+       @@
+0x0118  LATIN CAPITAL LETTER E WITH OGONEK
+        @
+  _____ @
+ | ____|@
+ |  _|_ @
+ |_____|@
+    (__(@@
+0x0119  LATIN SMALL LETTER E WITH OGONEK
+       @
+   ___ @
+  / _ \@
+ |  __/@
+  \___|@
+    (_(@@
+0x011A  LATIN CAPITAL LETTER E WITH CARON
+   \\// @
+  __\/_ @
+ | ____|@
+ |  _|_ @
+ |_____|@
+        @@
+0x011B  LATIN SMALL LETTER E WITH CARON
+   \\//@
+    \/ @
+  / _ \@
+ |  __/@
+  \___|@
+       @@
+0x011C  LATIN CAPITAL LETTER G WITH CIRCUMFLEX
+   _/\_ @
+  / ___|@
+ | |  _ @
+ | |_| |@
+  \____|@
+        @@
+0x011D  LATIN SMALL LETTER G WITH CIRCUMFLEX
+     /\ @
+   _/_ \@
+  / _` |@
+ | (_| |@
+  \__, |@
+  |___/ @@
+0x011E  LATIN CAPITAL LETTER G WITH BREVE
+   _\/_ @
+  / ___|@
+ | |  _ @
+ | |_| |@
+  \____|@
+        @@
+0x011F  LATIN SMALL LETTER G WITH BREVE
+  \___/ @
+   __ _ @
+  / _` |@
+ | (_| |@
+  \__, |@
+  |___/ @@
+0x0120  LATIN CAPITAL LETTER G WITH DOT ABOVE
+   _[]_ @
+  / ___|@
+ | |  _ @
+ | |_| |@
+  \____|@
+        @@
+0x0121  LATIN SMALL LETTER G WITH DOT ABOVE
+   []   @
+   __ _ @
+  / _` |@
+ | (_| |@
+  \__, |@
+  |___/ @@
+0x0122  LATIN CAPITAL LETTER G WITH CEDILLA
+   ____ @
+  / ___|@
+ | |  _ @
+ | |_| |@
+  \____|@
+   )__) @@
+0x0123  LATIN SMALL LETTER G WITH CEDILLA
+        @
+   __ _ @
+  / _` |@
+ | (_| |@
+  \__, |@
+  |_))))@@
+0x0124  LATIN CAPITAL LETTER H WITH CIRCUMFLEX
+  _/ \_ @
+ | / \ |@
+ | |_| |@
+ |  _  |@
+ |_| |_|@
+        @@
+0x0125  LATIN SMALL LETTER H WITH CIRCUMFLEX
+  _  /\ @
+ | |//\ @
+ | '_ \ @
+ | | | |@
+ |_| |_|@
+        @@
+0x0126  LATIN CAPITAL LETTER H WITH STROKE
+  _   _ @
+ | |=| |@
+ | |_| |@
+ |  _  |@
+ |_| |_|@
+        @@
+0x0127  LATIN SMALL LETTER H WITH STROKE
+  _     @
+ |=|__  @
+ | '_ \ @
+ | | | |@
+ |_| |_|@
+        @@
+0x0128  LATIN CAPITAL LETTER I WITH TILDE
+  /\//@
+ |_ _|@
+  | | @
+  | | @
+ |___|@
+      @@
+0x0129  LATIN SMALL LETTER I WITH TILDE
+    @
+ /\/@
+ | |@
+ | |@
+ |_|@
+    @@
+0x012A  LATIN CAPITAL LETTER I WITH MACRON
+ /___/@
+ |_ _|@
+  | | @
+  | | @
+ |___|@
+      @@
+0x012B  LATIN SMALL LETTER I WITH MACRON
+  ____@
+ /___/@
+  | | @
+  | | @
+  |_| @
+      @@
+0x012C  LATIN CAPITAL LETTER I WITH BREVE
+  \__/@
+ |_ _|@
+  | | @
+  | | @
+ |___|@
+      @@
+0x012D  LATIN SMALL LETTER I WITH BREVE
+    @
+ \_/@
+ | |@
+ | |@
+ |_|@
+    @@
+0x012E  LATIN CAPITAL LETTER I WITH OGONEK
+  ___ @
+ |_ _|@
+  | | @
+  | | @
+ |___|@
+  (__(@@
+0x012F  LATIN SMALL LETTER I WITH OGONEK
+  _  @
+ (_) @
+ | | @
+ | | @
+ |_|_@
+  (_(@@
+0x0130  LATIN CAPITAL LETTER I WITH DOT ABOVE
+  _[] @
+ |_ _|@
+  | | @
+  | | @
+ |___|@
+      @@
+0x0131  LATIN SMALL LETTER DOTLESS I
+    @
+  _ @
+ | |@
+ | |@
+ |_|@
+    @@
+0x0132  LATIN CAPITAL LIGATURE IJ
+  ___  _ @
+ |_ _|| |@
+  | | | |@
+  | |_| |@
+ |__|__/ @
+         @@
+0x0133  LATIN SMALL LIGATURE IJ
+  _   _ @
+ (_) (_)@
+ | | | |@
+ | | | |@
+ |_|_/ |@
+   |__/ @@
+0x0134  LATIN CAPITAL LETTER J WITH CIRCUMFLEX
+      /\ @
+     /_\|@
+  _  | | @
+ | |_| | @
+  \___/  @
+         @@
+0x0135  LATIN SMALL LETTER J WITH CIRCUMFLEX
+    /\@
+   /_\@
+   | |@
+   | |@
+  _/ |@
+ |__/ @@
+0x0136  LATIN CAPITAL LETTER K WITH CEDILLA
+  _  _  @
+ | |/ / @
+ | ' /  @
+ | . \  @
+ |_|\_\ @
+    )__)@@
+0x0137  LATIN SMALL LETTER K WITH CEDILLA
+  _    @
+ | | __@
+ | |/ /@
+ |   < @
+ |_|\_\@
+    )_)@@
+0x0138  LATIN SMALL LETTER KRA
+       @
+  _ __ @
+ | |/ \@
+ |   < @
+ |_|\_\@
+       @@
+0x0139  LATIN CAPITAL LETTER L WITH ACUTE
+  _   //@
+ | | // @
+ | |    @
+ | |___ @
+ |_____|@
+        @@
+0x013A  LATIN SMALL LETTER L WITH ACUTE
+  //@
+ | |@
+ | |@
+ | |@
+ |_|@
+    @@
+0x013B  LATIN CAPITAL LETTER L WITH CEDILLA
+  _     @
+ | |    @
+ | |    @
+ | |___ @
+ |_____|@
+    )__)@@
+0x013C  LATIN SMALL LETTER L WITH CEDILLA
+  _   @
+ | |  @
+ | |  @
+ | |  @
+ |_|  @
+   )_)@@
+0x013D  LATIN CAPITAL LETTER L WITH CARON
+  _ \\//@
+ | | \/ @
+ | |    @
+ | |___ @
+ |_____|@
+        @@
+0x013E  LATIN SMALL LETTER L WITH CARON
+  _ \\//@
+ | | \/ @
+ | |    @
+ | |    @
+ |_|    @
+        @@
+0x013F  LATIN CAPITAL LETTER L WITH MIDDLE DOT
+  _     @
+ | |    @
+ | | [] @
+ | |___ @
+ |_____|@
+        @@
+0x0140  LATIN SMALL LETTER L WITH MIDDLE DOT
+  _    @
+ | |   @
+ | | []@
+ | |   @
+ |_|   @
+       @@
+0x0141  LATIN CAPITAL LETTER L WITH STROKE
+  __    @
+ | //   @
+ |//|   @
+ // |__ @
+ |_____|@
+        @@
+0x0142  LATIN SMALL LETTER L WITH STROKE
+  _ @
+ | |@
+ |//@
+ //|@
+ |_|@
+    @@
+0x0143  LATIN CAPITAL LETTER N WITH ACUTE
+  _/ /_ @
+ | \ | |@
+ |  \| |@
+ | |\  |@
+ |_| \_|@
+        @@
+0x0144  LATIN SMALL LETTER N WITH ACUTE
+     _  @
+  _ /_/ @
+ | '_ \ @
+ | | | |@
+ |_| |_|@
+        @@
+0x0145  LATIN CAPITAL LETTER N WITH CEDILLA
+  _   _ @
+ | \ | |@
+ |  \| |@
+ | |\  |@
+ |_| \_|@
+ )_)    @@
+0x0146  LATIN SMALL LETTER N WITH CEDILLA
+        @
+  _ __  @
+ | '_ \ @
+ | | | |@
+ |_| |_|@
+ )_)    @@
+0x0147  LATIN CAPITAL LETTER N WITH CARON
+  _\/ _ @
+ | \ | |@
+ |  \| |@
+ | |\  |@
+ |_| \_|@
+        @@
+0x0148  LATIN SMALL LETTER N WITH CARON
+  \\//  @
+  _\/_  @
+ | '_ \ @
+ | | | |@
+ |_| |_|@
+        @@
+0x0149  LATIN SMALL LETTER N PRECEDED BY APOSTROPHE
+          @
+  _  __   @
+ ( )| '_\ @
+ |/| | | |@
+   |_| |_|@
+          @@
+0x014A  LATIN CAPITAL LETTER ENG
+  _   _ @
+ | \ | |@
+ |  \| |@
+ | |\  |@
+ |_| \ |@
+     )_)@@
+0x014B  LATIN SMALL LETTER ENG
+  _ __  @
+ | '_ \ @
+ | | | |@
+ |_| | |@
+     | |@
+    |__ @@
+0x014C  LATIN CAPITAL LETTER O WITH MACRON
+   ____ @
+  /_ _/ @
+  / _ \ @
+ | (_) |@
+  \___/ @
+        @@
+0x014D  LATIN SMALL LETTER O WITH MACRON
+   ____ @
+  /_ _/ @
+  / _ \ @
+ | (_) |@
+  \___/ @
+        @@
+0x014E  LATIN CAPITAL LETTER O WITH BREVE
+  \   / @
+   _-_  @
+  / _ \ @
+ | |_| |@
+  \___/ @
+        @@
+0x014F  LATIN SMALL LETTER O WITH BREVE
+  \   / @
+   _-_  @
+  / _ \ @
+ | |_| |@
+  \___/ @
+        @@
+0x0150  LATIN CAPITAL LETTER O WITH DOUBLE ACUTE
+    ___ @
+   /_/_/@
+  / _ \ @
+ | |_| |@
+  \___/ @
+        @@
+0x0151  LATIN SMALL LETTER O WITH DOUBLE ACUTE
+    ___ @
+   /_/_/@
+  / _ \ @
+ | |_| |@
+  \___/ @
+        @@
+0x0152  LATIN CAPITAL LIGATURE OE
+   ___  ___ @
+  / _ \| __|@
+ | | | |  | @
+ | |_| | |__@
+  \___/|____@
+            @@
+0x0153  LATIN SMALL LIGATURE OE
+             @
+   ___   ___ @
+  / _ \ / _ \@
+ | (_) |  __/@
+  \___/ \___|@
+             @@
+0x0154  LATIN CAPITAL LETTER R WITH ACUTE
+  _/_/  @
+ |  _ \ @
+ | |_) |@
+ |  _ < @
+ |_| \_\@
+        @@
+0x0155  LATIN SMALL LETTER R WITH ACUTE
+     __@
+  _ /_/@
+ | '__|@
+ | |   @
+ |_|   @
+       @@
+0x0156  LATIN CAPITAL LETTER R WITH CEDILLA
+  ____  @
+ |  _ \ @
+ | |_) |@
+ |  _ < @
+ |_| \_\@
+ )_)    @@
+0x0157  LATIN SMALL LETTER R WITH CEDILLA
+       @
+  _ __ @
+ | '__|@
+ | |   @
+ |_|   @
+   )_) @@
+0x0158  LATIN CAPITAL LETTER R WITH CARON
+  _\_/  @
+ |  _ \ @
+ | |_) |@
+ |  _ < @
+ |_| \_\@
+        @@
+0x0159  LATIN SMALL LETTER R WITH CARON
+  \\// @
+  _\/_ @
+ | '__|@
+ | |   @
+ |_|   @
+       @@
+0x015A  LATIN CAPITAL LETTER S WITH ACUTE
+  _/_/  @
+ / ___| @
+ \___ \ @
+  ___) |@
+ |____/ @
+        @@
+0x015B  LATIN SMALL LETTER S WITH ACUTE
+    __@
+  _/_/@
+ / __|@
+ \__ \@
+ |___/@
+      @@
+0x015C  LATIN CAPITAL LETTER S WITH CIRCUMFLEX
+  _/\_  @
+ / ___| @
+ \___ \ @
+  ___) |@
+ |____/ @
+        @@
+0x015D  LATIN SMALL LETTER S WITH CIRCUMFLEX
+      @
+  /_\_@
+ / __|@
+ \__ \@
+ |___/@
+      @@
+0x015E  LATIN CAPITAL LETTER S WITH CEDILLA
+  ____  @
+ / ___| @
+ \___ \ @
+  ___) |@
+ |____/ @
+    )__)@@
+0x015F  LATIN SMALL LETTER S WITH CEDILLA
+      @
+  ___ @
+ / __|@
+ \__ \@
+ |___/@
+   )_)@@
+0x0160  LATIN CAPITAL LETTER S WITH CARON
+  _\_/  @
+ / ___| @
+ \___ \ @
+  ___) |@
+ |____/ @
+        @@
+0x0161  LATIN SMALL LETTER S WITH CARON
+  \\//@
+  _\/ @
+ / __|@
+ \__ \@
+ |___/@
+      @@
+0x0162  LATIN CAPITAL LETTER T WITH CEDILLA
+  _____ @
+ |_   _|@
+   | |  @
+   | |  @
+   |_|  @
+    )__)@@
+0x0163  LATIN SMALL LETTER T WITH CEDILLA
+  _   @
+ | |_ @
+ | __|@
+ | |_ @
+  \__|@
+   )_)@@
+0x0164  LATIN CAPITAL LETTER T WITH CARON
+  _____ @
+ |_   _|@
+   | |  @
+   | |  @
+   |_|  @
+        @@
+0x0165  LATIN SMALL LETTER T WITH CARON
+  \/  @
+ | |_ @
+ | __|@
+ | |_ @
+  \__|@
+      @@
+0x0166  LATIN CAPITAL LETTER T WITH STROKE
+  _____ @
+ |_   _|@
+   | |  @
+  -|-|- @
+   |_|  @
+        @@
+0x0167  LATIN SMALL LETTER T WITH STROKE
+  _   @
+ | |_ @
+ | __|@
+ |-|_ @
+  \__|@
+      @@
+0x0168  LATIN CAPITAL LETTER U WITH TILDE
+        @
+  _/\/_ @
+ | | | |@
+ | |_| |@
+  \___/ @
+        @@
+0x0169  LATIN SMALL LETTER U WITH TILDE
+        @
+  _/\/_ @
+ | | | |@
+ | |_| |@
+  \__,_|@
+        @@
+0x016A  LATIN CAPITAL LETTER U WITH MACRON
+   ____ @
+  /__ _/@
+ | | | |@
+ | |_| |@
+  \___/ @
+        @@
+0x016B  LATIN SMALL LETTER U WITH MACRON
+   ____ @
+  / _  /@
+ | | | |@
+ | |_| |@
+  \__,_|@
+        @@
+0x016C  LATIN CAPITAL LETTER U WITH BREVE
+        @
+   \_/_ @
+ | | | |@
+ | |_| |@
+  \____|@
+        @@
+0x016D  LATIN SMALL LETTER U WITH BREVE
+        @
+   \_/_ @
+ | | | |@
+ | |_| |@
+  \__,_|@
+        @@
+0x016E  LATIN CAPITAL LETTER U WITH RING ABOVE
+    O   @
+  __  _ @
+ | | | |@
+ | |_| |@
+  \___/ @
+        @@
+0x016F  LATIN SMALL LETTER U WITH RING ABOVE
+    O   @
+  __ __ @
+ | | | |@
+ | |_| |@
+  \__,_|@
+        @@
+0x0170  LATIN CAPITAL LETTER U WITH DOUBLE ACUTE
+   -- --@
+  /_//_/@
+ | | | |@
+ | |_| |@
+  \___/ @
+        @@
+0x0171  LATIN SMALL LETTER U WITH DOUBLE ACUTE
+    ____@
+  _/_/_/@
+ | | | |@
+ | |_| |@
+  \__,_|@
+        @@
+0x0172  LATIN CAPITAL LETTER U WITH OGONEK
+  _   _ @
+ | | | |@
+ | | | |@
+ | |_| |@
+  \___/ @
+    (__(@@
+0x0173  LATIN SMALL LETTER U WITH OGONEK
+        @
+  _   _ @
+ | | | |@
+ | |_| |@
+  \__,_|@
+     (_(@@
+0x0174  LATIN CAPITAL LETTER W WITH CIRCUMFLEX
+ __    /\  __@
+ \ \  //\\/ /@
+  \ \ /\ / / @
+   \ V  V /  @
+    \_/\_/   @
+             @@
+0x0175  LATIN SMALL LETTER W WITH CIRCUMFLEX
+      /\   @
+ __  //\\__@
+ \ \ /\ / /@
+  \ V  V / @
+   \_/\_/  @
+           @@
+0x0176  LATIN CAPITAL LETTER Y WITH CIRCUMFLEX
+    /\  @
+ __//\\ @
+ \ \ / /@
+  \ V / @
+   |_|  @
+        @@
+0x0177  LATIN SMALL LETTER Y WITH CIRCUMFLEX
+    /\  @
+   //\\ @
+ | | | |@
+ | |_| |@
+  \__, |@
+  |___/ @@
+0x0178  LATIN CAPITAL LETTER Y WITH DIAERESIS
+  []  []@
+ __    _@
+ \ \ / /@
+  \ V / @
+   |_|  @
+        @@
+0x0179  LATIN CAPITAL LETTER Z WITH ACUTE
+  __/_/@
+ |__  /@
+   / / @
+  / /_ @
+ /____|@
+       @@
+0x017A  LATIN SMALL LETTER Z WITH ACUTE
+    _ @
+  _/_/@
+ |_  /@
+  / / @
+ /___|@
+      @@
+0x017B  LATIN CAPITAL LETTER Z WITH DOT ABOVE
+  __[]_@
+ |__  /@
+   / / @
+  / /_ @
+ /____|@
+       @@
+0x017C  LATIN SMALL LETTER Z WITH DOT ABOVE
+   [] @
+  ____@
+ |_  /@
+  / / @
+ /___|@
+      @@
+0x017D  LATIN CAPITAL LETTER Z WITH CARON
+  _\_/_@
+ |__  /@
+   / / @
+  / /_ @
+ /____|@
+       @@
+0x017E  LATIN SMALL LETTER Z WITH CARON
+  \\//@
+  _\/_@
+ |_  /@
+  / / @
+ /___|@
+      @@
+0x017F  LATIN SMALL LETTER LONG S
+     __ @
+    / _|@
+ |-| |  @
+ |-| |  @
+   |_|  @
+        @@
+0x02C7  CARON
+ \\//@
+  \/ @
+    $@
+    $@
+    $@
+    $@@
+0x02D8  BREVE
+ \\_//@
+  \_/ @
+     $@
+     $@
+     $@
+     $@@
+0x02D9  DOT ABOVE
+ []@
+  $@
+  $@
+  $@
+  $@
+  $@@
+0x02DB  OGONEK
+    $@
+    $@
+    $@
+    $@
+    $@
+ )_) @@
+0x02DD  DOUBLE ACUTE ACCENT
+  _ _ @
+ /_/_/@
+     $@
+     $@
+     $@
+     $@@